使用超类类型作为子类实例

2023-11-24

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

给定以下类层次结构:

class SuperClass{}
class SubClass extends SuperClass{}

为什么人们使用这种模式来实例化子类:

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);

事实上,据我所知,变量类型在运行时毫无意义。它们仅由编译器使用!

将变量定义为 SuperClass 的另一个可能原因是,如果它有几个不同的子类,并且该变量应该在运行时将其引用切换到其中的几个子类,但我只在类中看到这种情况(不是 super,不是 sub。只是上课)。绝对不足以需要一般模式......


这种类型编码的主要论点是因为里氏替换原则,其中指出如果X是类型的子类型T,那么任何实例T应该可以换成X.

这样做的好处很简单。假设我们有一个具有属性文件的程序,如下所示:

mode="Run"

你的程序看起来像这样:

public void Program
{
    public Mode mode;

    public static void main(String[] args)
    {
        mode = Config.getMode();
        mode.run();
    }
}

简而言之,该程序将使用配置文件来定义该程序启动的模式。Config class, 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();  
    }
}

为什么这行不通?

现在,因为您有类型的引用Mode,您只需更改程序的值即可完全更改程序的功能mode财产。如果你有public RunMode mode,您将无法使用此类功能。

为什么这是一件好事

这种模式非常流行,因为它开放了程序的可扩展性。这意味着,如果作者希望实现此类功能,则可以通过最少的更改来实现此类所需的功能。我的意思是,来吧。您更改配置文件中的一个单词并完全改变程序流程,而无需编辑一行代码。这是可取的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用超类类型作为子类实例 的相关文章

随机推荐

  • CPP + 正则表达式验证 URL

    我想在 c MFC 中构建一个正则表达式来验证 URL 正则表达式必须满足以下条件 有效网址 http cu 241 dell tech co in MyWebSite ISAPIWEBSITE Denypage aspx http www
  • Android Contentprovider - 在插入方法中更新

    可以打电话吗SQLiteDatabase更新方法在insert 内容提供者的重写方法 基本上没问题 但由于你没有提供代码 我只能发布两种可能的方法 First In your content provider public Uri inse
  • 如何重置字典中的所有值

    green 0 y3 1 m tt 0 newaccount 0 egg 0 results 0 dan 0 Lewis 0 NewAccount2 0 testyear3 1 testyear6 0 NewAccount1 0 testy
  • 如何设置TextInputLayout错误消息颜色?

    如何更改可设置为显示在文本字段下方的错误消息的颜色TextInputLayout via setError 在这里查看错误状态 它通常显示为红色 我想改变它 我应该在我的项目中使用哪些项目名称 键styles xml文件来定位颜色 Edit
  • 使用 Jenkins 从机器 B 运行机器 A 的构建

    我有 2 台电脑 Com A Com B 我在 Com A 上使用 selenium webdriver Testng 和 maven 构建自动化功能脚本 Com A 已经安装了 Jenkins 的所有内容 但 Com B 只有 jenki
  • 避免 WordPress 插件上的 jquery 冲突的防弹方法

    我开发 WordPress 插件已经有一段时间了 我的所有插件似乎总是遇到以下问题 Jquery 冲突问题 我尝试了很多不同的方法来避免这些问题 但我总是让用户联系我说 当他们安装了我的一个插件时 它已经阻止了另一个插件的工作aahhhhh
  • 使用 swift 在图像上覆盖文本

    我正在尝试使用 Swift 在图像上覆盖一些文本 并在此处查看此代码 src 如何在 iOS Swift 中向图像添加文本 这会将文本置于正中央 我一直在改变价值观 var rect CGRectMake 10 150 inImage si
  • 如何获取android中停止服务的意图

    我在用stopService 停止服务 我想发送额外的数据意图 如何在服务中检索这些额外数据 据我所知 这个Intent未交付至Service以任何方式 代替stopService 您可以使用startService 传递您的额外内容 并在
  • 将新节点添加到现有 XmlDocument 对象

    我有一个以下格式的 xml
  • 玩!框架 - 视图未编译?

    我创建了一个新项目并使用 eclipse 使用eclipsify命令 基本上 我移动了app目录从旧项目到我创建的新项目 问题是 eclipse 无法识别这些视图 我收到如下错误 views html viewTopic 无法解析为类型 我
  • 反序列化期间未知元素将被忽略

    当我使用 XmlTextReader 反序列化 XML 文档时 没有相应类的文本元素将被简单地忽略 Note 这是not关于 XML 中缺少的元素 这些元素需要存在 而是存在于 XML 文本中 而在代码中没有等效属性 我本希望得到一个异常
  • 如何将日期时间格式设置为 24 小时时间?

    我需要日期时间中的字符串来以 24 小时格式显示时间 var curr DateTime Now string s Console WriteLine s 输出结果必须是 16 38 谢谢 使用大写HH对于 24 小时格式 String s
  • python合并两个列表(偶数/奇数元素)

    给定两个列表 我想合并它们 以便第一个列表中的所有元素都是偶数索引 保留它们的顺序 第二个列表中的所有元素都是奇数索引 也保留它们的顺序 下面的例子 x 0 1 2 y 3 4 result 0 3 1 4 2 我可以使用 for 循环来做
  • Laravel 没有数据库连接

    有没有一种方法可以在没有数据库连接的情况下使用 Laravel 我计划使用 Blade 和 VueJS 创建一个前端网站 该网站将使用第三方 API 并且不需要数据库 目前 我收到此错误 但不知道如何绕过它 Database name se
  • 可以全屏打开程序的应用程序?

    我需要制作一个在全屏模式下启动新程序 例如记事本 的应用程序 我可以在 c 中做到这一点吗 我希望有一个代码示例 谢谢 您可以使用Process Start with a ProcessStartInfo对象有一个WindowStyle财产
  • 如何指定库路径的首选项?

    我正在使用以下命令编译 C 程序g and ld 我有一个 so我想在链接期间使用的库 然而 同名的库存在于 usr local lib and ld正在选择该库而不是我直接指定的库 我怎样才能解决这个问题 对于下面的示例 我的库文件是 m
  • 如何让 Jersey 对响应消息正文使用 GZip 压缩

    我正在尝试编写一个简单的 Jersey 应用程序 它将文件从 Jersey 客户端发送到 Jersey 服务器并返回 但是 这些文件似乎仅在从客户端到服务器的途中进行编码 而不是在其他方式上进行编码 我想知道如何改变这种行为 我正在一个简单
  • 如何将docker容器中的目录挂载到主机上?

    在 docker 容器中挂载主机目录非常容易 但我需要相反的方式 我使用 docker 容器作为开发 WordPress 插件的开发环境 这个 docker 容器包含运行 WordPress 所需的一切 MySQL Apache PHP 和
  • 将数组值转换为对象键

    我做了一个 get 返回一个 json 对象 如下所示 data 2016 Pass Fail Rates by Test Centre Passes No ID Fails Fail Dangerous Total Sometown 8
  • 使用超类类型作为子类实例

    我知道这个问题已经被问了很多次 但在我看来 通常的答案远不能令人满意 给定以下类层次结构 class SuperClass class SubClass extends SuperClass 为什么人们使用这种模式来实例化子类 SuperC