【问题标题】:What is difference between ParentClass obj=New ChildChildClass() and ParentClass obj=New ParentClass()?ParentClass obj=New ChildChildClass() 和 ParentClass obj=New ParentClass() 有什么区别?
【发布时间】:2016-03-20 05:07:40
【问题描述】:

谁能解释一下有什么区别

ParentClass obj= new ChildChildClass();     

ParentClass obj= new ParentClass();

由于两者

class ParentClass{
   public void ParentClassMethod(){
   }
}

class ChildClass : ParentClass{
   public void ChildClassMethod(){
   }
}

据我了解,在这两种情况下,可访问的内容保持不变。那么有什么意义呢?

【问题讨论】:

  • 如果基类是abstract 或有任何virtual 方法,您会看到不同。在这种具体情况下,没有区别,除了使用派生(子)类作为变量类型将允许您也访问其子方法(并且可能能够将其传递给不同的、更具体的方法)。
  • 您可以将第一个转换为 ChildClass,从而访问 ChildClass 的方法和属性。
  • 您是否尝试过搜索?处理多态性的大量问答。一旦你引入另一种派生自ParentClass 的类型,它就会变得很明显。
  • 那次搜索的结果是什么?
  • 是的,您的问题是什么? “有什么区别”除了“你正在实例化两个不同的类”之外,并不能真正回答。

标签: c# .net class oop object


【解决方案1】:

您可以覆盖虚拟方法。一个简单的例子:

void Main()
{
  A realA = new A();
  A actuallyB = new B();

  Console.WriteLine(realA.GetName()); // John
  Console.WriteLine(actuallyB.GetName()); // Gillian

  PrintName(realA); // John
  PrintName(actuallyB); // Gillian
}

public void PrintName(A anyA)
{
  Console.WriteLine(anyA.GetName());
}

public class A
{
  public virtual string GetName() 
  {
    return "John";
  }
}

public class B : A
{
  public override string GetName() 
  {
    return "Gillian";
  }
}

您的两个类可以有不同的行为(当然,在 Liskov 替换原则的范围内),但辅助方法 PrintName 将适用于两者。

事实上,这就是继承存在的全部原因——你暴露了一些有用的接口,每个使用它的人都可以以一种方式对待它。如果你想要一个更真实的例子,让我们看看Stream 类。例如,您可能有一个从流中读取图像的辅助方法。现在,当您需要从文件中读取图像时,您只需将文件流传递给您的辅助方法。当您想从数据库中读取图像时,您只需传递一个数据库流。当您想从 Web 服务器读取图像时...只要流符合流接口(事实是,流的设计并不完全完美;)),您可以随意切换它们,一切将按预期工作。

【讨论】:

    【解决方案2】:
    ParentClass obj = new ChildChildClass(); 
    

    这里的 obj 实际上是一个 ChildChildClass,您可以随时将其转换回 ParentClass 并调用 ParentClass 中可用的方法。

    这种用法的好处是您可以拥有一些仅适用于 ParentClass 的通用功能,并且您还想传递 ChildChildClass,因为它也是 ParentClass。

    【讨论】:

    • "您可以随时将其转换回 ParentClass" - 不需要,它已经这样声明了。
    【解决方案3】:

    很难说“区别在于……”

    它是称为继承的 OOP 原则之一。这意味着ChildClass同时是ParentClass。因此,您可以将这两种类型存储在 ParentType 类型的集合中或作为参数传递。但是要访问孩子的方法,您需要强制转换为孩子的类型。

    【讨论】:

      【解决方案4】:

      您正在实例化两个完全不同的对象(在某种程度上,它们都恰好是ParentClass)。虽然现在代码会将它们视为相同的类型,但底层对象会有所不同。

      我可以采用相同的想法并使其更明显:

      object o = "Hello World!";
      object o2 = 15;
      

      stringint 都是对象,所以这很好。但是这里的底层类型肯定是不同的。

      【讨论】:

      • 好的,所以在我的第一种情况下,我正在创建 ChildClass 的对象。但我只能访问它从其基类派生的那些成员。在第二种情况下,我正在创建一个 ParentClass 的对象,所以我自然只能访问该类中的成员。我说的对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2014-02-16
      • 2015-12-13
      • 2018-08-02
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多