假设我有一个超类BigClass
,以及继承自它的子类LittleClass
。 BigClass有一个方法DoThing(),而LittleClass有一个具有不同功能的重写DoThing()方法。
以这种方式实例化子类是否有所不同:
BigClass myNewClass = new LittleClass();
或这个:
LittleClass myNewClass = new LittleClass();
我可以看到为什么第一个更有用,因为你可以在一行中声明许多不同的子类,但除此之外是否有任何区别?
BigClass
引用只能访问BigClass
功能,无论它在何处实现(例如,BigClass
或LittleClass
)。换句话说,如果LittleClass
有一个方法没有覆盖BigClass
的东西你就不能用BigClass
引用来调用它。
在运行时没有区别(从某种意义上说,你的意思是)。在两种情况下,myNewClass
变量都指向LittleClass
类型的对象。您调用它的任何方法都将在派生类(LittleClass
)中执行,如果它明确地覆盖它们。如果没有,它们将在超类中搜索/调用,如果不在超类中等等。
不同之处在于编译时。如果你在下一行尝试调用method
定义的某个方法LittleClass
(但不是BigClass
),这将不会在第一个场景中编译,而是在第二个场景中编译。
就DoThing()
方法而言,没有区别。
现在,假设LittleClass
类具有未被继承的DoEverything()
方法,因为它甚至不存在于超类中。
在这种情况下,myNewClass.DoEverything()
仅在您的第二种情况下合法(使用LittleClass()
类型的参考变量)。
第一个是有用的,因为您可以使用基类处理程序具有多态行为。如果您知道Base Class处理程序将始终只具有此Derived Class对象,则具有基类或派生类的Handler没有太大区别。
另一个区别是Base类处理程序无法访问Derived Class中实现的非抽象方法。
区别仅在于第一种情况
BigClass myNewClass = new LittleClass();
你只能使用
myNewclass
对象访问方法属于超类。
一个例子是工厂设计模式:在工厂模式中,您将拥有一个根据用户需要创建各种子类的方法,在这种情况下返回类型将是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();