假设我有一个超类BigClass
,并且继承了它的子类LittleClass
。 BigClass有一个方法DoThing(),LittleClass有一个具有不同功能的重写DoThing()方法。
以任何方式实现这样的子类是否有所不同:
BigClass myNewClass = new LittleClass();
或者这个:
LittleClass myNewClass = new LittleClass();
我可以看到为什么第一个会更有用,因为你可以在一行中声明很多不同的子类,但除此之外是否有任何区别?
答案 0 :(得分:0)
在运行时没有区别(从某种意义上说,你的意思是)。在两种情况下,您的myNewClass
变量都指向LittleClass
类型的对象。您调用它的任何方法都将在派生类(LittleClass
)中执行,如果它明确地覆盖它们。如果没有,它们将在超类中搜索/调用,如果不在超类中等等。
区别在于编译时。如果在下一行,您尝试仅调用由method
定义的方法LittleClass
(但不是BigClass
),这将不会在第一个方案中编译,而是在第二个方案中编译。
答案 1 :(得分:0)
BigClass
引用只能访问BigClass
个功能,无论其实现位置如何(例如BigClass
或LittleClass
)。换句话说,如果LittleClass
的方法没有覆盖BigClass
的某些内容,则无法使用BigClass
引用进行调用。
答案 2 :(得分:0)
就DoThing()
方法而言,没有区别。
现在,假设LittleClass
类具有未被继承的DoEverything()
方法,因为它甚至不存在于超类中。
我是这样的,myNewClass.DoEverything()
仅在您的第二种情况下合法(参考变量为LittleClass()
类型)。
答案 3 :(得分:0)
第一个是有用的,因为您可以使用基类处理程序具有多态行为。如果您知道基类处理程序将始终只有此Derived Class对象,则具有基类或派生类的Handler没有太大区别。
另一个区别是Base类处理程序无法访问Derived Class中实现的非抽象方法。
答案 4 :(得分:0)
区别仅在于第一种情况
BigClass myNewClass = new LittleClass();
你只能使用
myNewclass
访问方法的对象属于超类。
答案 5 :(得分:0)
一个示例是Factory设计模式: 在工厂模式下,您将拥有一个根据用户需要创建各种子类的方法,在这种情况下,返回的类型将为BigClass。
示例:
class Factory {
public BigClass getInstance(int type) {
switch(type) {
case BMW: return new LittleClass() ;
case AUDI: return new Child2() ;
DEFAULT: return new BigClass();
}
}
}
要使用此功能:
BigClass obj = factory.getInstance(AUDI); obj.getPerformanceIndicators();