确定子类。多态性或实例

时间:2013-03-31 15:24:42

标签: java polymorphism subclass

说我有3节课。一类是超类,另外两类是从它继承的。如果我有一个超类的实例,我想知道这两个子类中的哪一个,这个对象是实例。

两种方法中的哪一种被认为是最佳做法: 1)使用instanceOf或getClass()并比较,或 2)在超类上声明一个抽象方法并在子类上实现它以获得表示该类的枚举。

5 个答案:

答案 0 :(得分:1)

这种情况下的最佳做法是多态性。在超类中创建一个抽象方法。子类将有义务提供具体的实施。不需要instanceof或getClass。

答案 1 :(得分:0)

大多数情况下,多态性是更好的答案。如果你必须询问哪个子类,那么当添加新的子类时,就有可能忘记在该问题中添加新的“if”部分。

答案 2 :(得分:0)

你应该使用instanceOf。使用enum的方法,您必须事先知道您将在稍后检查并且必须为其准备类。所以我更喜欢instanceOf。

答案 3 :(得分:0)

简答:可能是您尝试以最佳方式使用类对象或类名称的情况;通过避免它,你可能会使你的代码更清晰,更容易理解和扩展。

长(呃)答案:在编写面向对象的软件代码(特别是Java)时,(Subtype) Polymorphism的原则被大量使用。在你的问题的上下文中使它超级简化:如果你有一个A类的实例,A类被B和C扩展,你努力只使用它的公共方法将A视为“一般”A.成员;如果你想要为B和C做一些不同的事情,你可以在A上为这个动作编写一个方法doSomething(),在B和C中通过重写A.doSomething()(A的默认实现)来实现。< / p>

(如@ EvgeniyDorofeev的answer所示,如果没有默认操作,你可以使你的默认方法是抽象的;但是A必须是一个抽象类。)

这有几个好处:

  • A的代码不需要熟悉B和C.
  • 如果你以后添加其他类,比如说D扩展A和E扩展C,你就不需要修改你现有的代码 - 只需覆盖它们中的doSomething()。
  • 您无需担心使用getClass()或为类创建人工枚举......: - )

但它有时也受到批评,作为对面向对象方法的更一般性批评的一部分(例如,参见The Noun ShuffleOOP Oversold)。

PS:有时您无法避免使用getClass()(例如,准备包含类名的日志消息); OP没有说明他/她面临的确切问题,因此很难说清楚。在任何情况下, not 都要沿着为类编写自己的枚举的道路前进;使用getClass()(如果你真的需要,你也可以从中获取类名)。另外,你可能会发现你可以使用一个库来处理这些事情,所以你根本不需要getClass()(记录的情况就是我给出的例子。)

答案 4 :(得分:-2)

通常最好的做法是调用布尔函数instanceOf(),这应该可以正常工作。

虽然我自己发现你的第二个解决方案更容易使用,但第一个解决方案被认为是一个很好的编程实践。