【问题标题】:Instantiating a new object with a different constructor [duplicate]用不同的构造函数实例化一个新对象[重复]
【发布时间】:2015-12-04 04:26:36
【问题描述】:

编辑:抱歉,如果这看起来有点明显/简单,我尝试找到答案,但我不知道如何正确表达它

我一直在学习一点 C#,但在理解实例化的新对象时遇到了一些麻烦,其中构造函数和类类型不同。因此,常规对象将通过以下方式实例化:

Object obj = new Object();

这很明显,但是由于我一直在研究接口,所以我遇到了一些语法,如下所示:

interface ISaveable {
    string Save();
}

public class Catalog : ISaveable {
    string Save() {
        return "Catalog Save";
    }

    string ISaveable.Save(){
        return "ISaveable Save";
    }
}

然后教程继续按照以下方式做一些事情:

Catalog c1 = new Catalog();

所以我知道这里正在实例化目录类的一个新实例,但是我终其一生都无法弄清楚下一行:

ISaveable c2 = new Catalog();

现在实际代码本身没有问题(我理解接口的显式和隐式实现等),但这只是上面对象c2的实际实例化的部分。为什么类类型(ISaveable)与构造函数(new Catalog())不同?

任何解释将不胜感激!

【问题讨论】:

  • 这里想说什么:为什么类类型(ISaveable)与构造函数(new Catalog())不同?
  • 您对术语“构造函数”和“显式接口实现”的使用增加了噪音。这只是关于对象类型和引用。
  • 目录类实现了 ISaveable 接口。因此,您可以像 ISaveable 一样声明 c2,然后将其实例化为 Catalog 类型的对象。如果你有另一个名为 Catalog2 的类,你可以这样做: ISaveable c2 = new Catalog2();
  • “类类型”与构造函数没有区别,变量的声明类型与被实例化对象的运行时类型不同。 c2 仍然是 Catalog 它只是被声明为 ISaveable。与object obj = new SomeOtherType() 之类的操作没有什么不同
  • @BenRobinson 这是我不太明白的一件事,因为我已经开始学习 OOP,所以我总是使用相同的变量类型和运行时类型声明对象(就像在我的第一个代码块中一样更多);我从来没有在对象的运行时类型与变量的声明类型不同的情况下这样做=/

标签: c# oop object instance instantiation


【解决方案1】:

据我了解,由

创建的对象的实际类型
Catalog c1 = new Catalog();

ISaveable c2 = new Catalog();

相同,即Catalog(调用同一个构造函数),但是引用的类型不同;在c1c2 上调用Save 将导致调用不同的实现。

【讨论】:

    【解决方案2】:

    现在实际代码本身没有问题(我明白明确和 接口的隐式实现等),但这只是一部分 关于上述对象 c2 的实际实例化。为什么是 类类型(ISaveable)不同于构造函数(new Catalog())?

    ISaveable c2 = new Catalog();

    在上面的代码中,你是:

    • 创建一个新的Catalog 对象
    • 使用ISaveable 类型的变量来引用它

    所以基本上你有一个Catalog 的具体实现,但你必须将它用作ISaveable

    【讨论】:

    • 所以如果我尝试调用 c2.Save() 它不会返回“Catalog Save”,而是返回“ISaveable Save”?
    • @harveysingh 是的,这基本上就是显式和隐式接口实现之间的区别。这是一个不同的问题,请参阅stackoverflow.com/a/143423/870604
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多