我知道这个问题已经问了很多,但是通常的答案在我看来还远远不能令人满意。
给定以下类层次结构:
class SuperClass{}
class SubClass extends SuperClass{}
人们为什么使用此模式实例化SubClass:
SuperClass instance = new SubClass();
而不是这个:
SubClass instance = new SubClass();
现在,我看到的常见答案是,这是为了instance
作为参数发送给需要SuperClass实例的方法,如下所示:
void aFunction(SuperClass param){}
//somewhere else in the code...
...
aFunction(instance);
...
但是我可以将SubClass的实例发送给aFunction,而不管持有它的变量的类型如何!意味着以下代码将编译并且运行时没有错误(假设先前提供的aFunction定义):
SubClass instance = new SubClass();
aFunction(instance);
实际上,AFAIK变量类型在运行时是没有意义的。它们仅由编译器使用!
将变量定义为SuperClass的另一个可能原因是,如果它具有多个不同的子类,并且应该在运行时将变量的引用切换到其中的多个子类,但是例如,我仅看到这种情况在类中发生(不是super,不是sub。刚刚上课)。绝对不足以需要一般模式...
这种编码类型的主要论据是由于Liskov替代原理,该原理指出,如果X
是type的子类型T
,则的任何实例T
都应能够与互换X
。
这样做的好处很简单。假设我们有一个包含属性文件的程序,如下所示:
mode="Run"
您的程序如下所示:
public void Program
{
public Mode mode;
public static void main(String[] args)
{
mode = Config.getMode();
mode.run();
}
}
简而言之,该程序将使用配置文件来定义该程序将以哪种模式启动。在Config
类中,getMode()
可能看起来像这样:
public Mode getMode()
{
String type = getProperty("mode"); // Now equals "Run" in our example.
switch(type)
{
case "Run": return new RunMode();
case "Halt": return new HaltMode();
}
}
为什么这将无法正常工作
现在,由于有了type的引用,因此Mode
只需更改mode
属性的值即可完全更改程序的功能。如果拥有public RunMode mode
,则将无法使用这种类型的功能。
为什么这是一件好事
这种模式之所以如此流行,是因为它为可扩展性打开了程序。这意味着,如果作者希望实现此类功能,则只需少量更改即可实现此类所需功能。我的意思是,来吧。您只需更改一个配置文件中的一个单词,即可完全更改程序流程,而无需编辑任何一行代码。这是可取的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句