2008-10-15 34 views
2

让我们有下面的类层次结构:是否有可能在Java中的派生类中实现接口?

public class ParentClass implements SomeInterface { 
} 

public class ChildClass extends ParentClass { 
} 

然后让我们这两个实例:

ParentClass parent; 
ChildClass child; 

然后我们有以下TRUE语句

(parent instanceof SomeInterface) == true 
(child instanceof SomeInterface) == true 

是否有可能unimplement的ChildClass中的SomeInterface,所以当我们检查instanceof运算符时它返回false?

如果不行,是否有解决方法?

回答

18

不,这是不可能的,你的意图是一个很好的暗示,你的类层次结构中存在某些缺陷。

解决方法:更改类层次结构,例如。像这样:

interface SomeInterface {} 
abstract class AbstractParentClass {} 
class ParentClass extends AbstractParentClass implements SomeInterface {} 
class ChildClass extends AbstractParentClass {} 
2

这是不可能的,这样做会违反ChildClass和ParentClass之间隐含的IS-A关系。你为什么想这样做?

-1

也许你有一个可以设计出更好的解决方案的具体案例,但对于通用案例,你需要一些黑魔法。最终Javassist可以用来“破解”你的对象,但我不太确定。

2

我不认为你可以“实现”它,但你可以检查它是否是父类的一个实例。你的界面是?如果是这样,你可以扩展它来包含一个带有语义的“IsObjectDerived”方法,如果这个类只从对象派生出来,它将返回true。既然你正在写这个类,你所需要做的就是在父类中实现它,并且如果对象是Parent类,则返回true,否则返回false。

你也可以通过检查当前类的超类并确保它是对象来做到这一点。我可能会这样做,因为实现类不能说谎。你可能想看看我发现的Java反射tutorial

[编辑]一般来说,我认为这似乎在一个合理的设计是不必要的,但它可以做到。

0

我认为你应该把这个问题作为你的界面和类设计有缺陷的明确指示。即使你可以用Java来做(而且我认为你不能),你也不应该这样做。

如何重新分解ParentClass,以便您将SomeInterface实现与ChildClass中需要的实现分开。也许你需要一个用于ParentClass和ChildClass的公共基类。

7

也许组成,而不是继承的是你想要的,即有一个“基础类”的对象为成员,并只实现你所需要的接口,转发需要对成员的任何方法。

0

我看不出这是怎么回事,但你可能动态地改变一个类使用由Shigeru Chiba等人创建的优秀包Javassist。使用这种方法,您可以添加和删除类中的特征,然后使用这些类的实例而不保存为类文件。

动态,有趣和完全混淆的任何人。谨慎使用是我的建议,但请充分利用它,因为在我看来,它使您成为更好的程序员。 (我相信ASM以类似的方式工作,但到目前为止我还没有尝试过,它似乎在JVM上工作的非Java语言创建者中非常流行,所以它可能是很好的。)

3

我同意其他答案,这是不可能在Java中。

其他答案进一步表明它显示了你的设计中的缺陷。

虽然我同意他们的观点,这是唯一公平地指出,一些著名的专家OO(特别是伯特兰·迈耶)我们不同意,并相信这样的设计应该被允许。

其他OO遗传模型(值得注意的是,迈耶的艾菲尔编程语言)都支持你正在寻找(CAT)功能“可用性或类型的变化”。

1

由于继承,多态OOP的基础上,表示是-A的关系 - 你的问题似乎要求的方式来重新定义“是”的关系是“不”的关系。

这是行不通的。

回到一些介绍面向对象的文本或在线资料和研究什么的面向对象的方法:多态,封装和身份。

  1. 剥离身份,你有COM/ActiveX和被盗的凭据。
  2. 剥离封装,没有人是安全的。
  3. 剥去多义主义的类型规则,你基本上什么都不是,它说的是什么。

如果你想这样的情况,那么在“C”计划。不要混淆假装使用OOP语言功能编写OOP代码。只需使用结构来保存你的数据。把工会放在任何地方。放弃使用类型转换。

你的计划有可能将无法可靠地工作,但您将能够规避任何限制的语言如Java和C++都推出使程序更可靠,更易于阅读,并更容易编写/修改。

在动态编程语言如SmalTalk或Python,你基本上可以翻录展翅腾飞在运行时的蝴蝶。但只能通过改变/破坏对象的类型。

这样做不会为你买东西。有代码/设计技术和设计模式可以让你实现任何“好”的结果,你可能会在这之后得到类似的结果。

,如果你认为的正是你试图在你的应用程序做的,然后试图找到实现最安全/最简单的方法是最好的,使用声技术。

相关问题