【问题标题】:Why use different type and constructor when instantiating a class?为什么在实例化类时使用不同的类型和构造函数?
【发布时间】:2020-06-03 07:03:31
【问题描述】:

假设我们有一个类ProductA,它继承了另一个名为Product 的类。什么意思

Product product = new ProductA();

那和有什么区别

ProductA product = new ProductA();

【问题讨论】:

  • 在你的具体例子中 - 没有区别。除了后面方法上的“新”修饰符将覆盖第二个示例中的行为,但你永远不应该使用它,这只是遗留世界的另一个垃圾。
  • 那么这两种语法在什么情况下会有区别呢?
  • @eocron 我们正在讨论实例的构造并将该实例分配给变量。
  • 这远远超出了构造函数问题,@SirRufo。一个基类和它的后代可以是完全不同的东西(例如硬件和打印机)。
  • @palapapa,如果你把这个对象发送给一个方法,比如 public void DoSomething(ProductA productA) { ...} 那么第一个对象会产生编译时错误,而第二个不会.

标签: c# oop constructor


【解决方案1】:

初始化时,没有区别。这就像说“ProductAProduct 类型的东西”。

在面向对象的编程中,IS-A的概念是基于继承的,可以分为类继承和接口继承两种。

那么这两种语法在什么情况下可以有 区别?

Why to use Polymorphism?

Why and when use polymorphism?

补充阅读:The difference between virtual, override, new and sealed override

【讨论】:

  • 一般来说,我同意你的看法,但 No Difference 并不总是正确的。如果一个子类比基类有更多的功能,在第一个例子中,他错过了这个功能。或者如果子类基于糟糕的代码,隐藏一个继承的成员,他们就会有区别。
  • runtime 实例创建没有区别(例如,它们都将在反射中返回相同的 product.GetType())。在代码中如何处理产品方面会有很大的不同(例如 typeof(Product) 和 typeof(ProductA) 不同)。
【解决方案2】:

很大的不同。上下文差异。普遍性差异。给你举个简单的例子

public class Animal {
 ...
}

public class Dog : Animal {
...
}

那么如果你有一个Animal dog = new Dog();,它不会暴露(在编译时领域)狗对动物的任何额外属性。您的“狗”只是一种动物,因此应该对其进行治疗。例如,智能感知自动完成中不会出现任何其他内容。因此,当你使用这个物体时,你想“知道”的只是它是一个动物。如果你有一个Dog dog = new Dog();,你想(在编译时领域)把它当作狗对待。它将公开它的全部功能和属性。例如,狗有尾巴,而动物则没有。你想在你的代码中使用“tail”属性吗?

还假设您有一个带有TakeCareOfDog(Dog myDoggy) 方法的DogTender。如果你说 Animal dog = new Dog();比 DogTender 的实例不能处理你的狗(因为它不是狗。它是动物)。但是,您的动物可以很好地适应AnimalCollection(如Zoo)。我们称之为 Liskov 原则或 Substitution 原则 - 后代类告诉它们的基类 - “你能做的任何事情,我都可以做得更好”。动物能做的事,狗也能做,但反过来不行。

【讨论】:

    【解决方案3】:

    在创建什么实例方面没有区别,但是有区别。在您的第一个示例中,您只能访问由Product 定义的成员。

    这类似于以下内容。

    object x1 = "hello";
    string x2 = "hello";
    

    在这两种情况下都会创建一个字符串实例,但您可以在x2 上调用.Length,但不能在x1 上调用。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 2017-11-09
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2012-06-08
      • 2018-01-21
      相关资源
      最近更新 更多