对子类实例使用超类类型

用户名

我知道这个问题已经问了很多,但是通常的答案在我看来还远远不能令人满意。

给定以下类层次结构:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用超类的构造函数创建子类的实例

如何使超类方法返回子类的实例

在抽象超类中使用子类的泛型类型?

使用JAXB将子类实例作为超类传递

我可以使用超类的类工厂静态方法创建子类实例吗?

Java:从子类获取超类的实例

使用子类和超类引用访问实例方法

如何使用超类构造函数创建子类的实例?

对子类对象的超类引用显示与对子类对象的子类引用相同的行为

从现有超类实例化子类

Scala-为什么使用具有两个泛型参数的超类型会导致Scala类型检查器对子类型进行不同的处理?

返回子类作为超类的类型

如何从超类创建子类的实例?

在子类实例化中使用替代超类构造函数

Kotlin类型,子类型和超类型与类,子类和超类

将子类实例化为超类类型有什么优势?

超类类型对象的子类的构造方法?

从超类初始化子类的类实例变量

Java,子类而不是超类的实例

如何从超类创建子类的实例的数组

当另一个类仅知道超类时,如何获得对子类的访问?

在子类的方法中本地调用超类方法时,使用“ super”关键字还是使用超类实例?

从子类更改超类实例变量

如何使用超类的实例访问子类的覆盖变量

通过超类实例调用子类类的方法

使子类序列化为超类的实例?

如何从 Python 中现有的超类类型对象实例化子类类型变量

对子类中的子类方法使用超类参数

在 Python 中从超类实例扩展子类实例