为什么需要创建子类的参考

本文关键字:参考 子类 创建 为什么 | 更新日期: 2023-09-27 18:32:04

假设我有两个类,父类和子类,子类继承父类

class childclass : parentclass
{
  childclass c = new childclass();             //instance 
  parentclass p = c ;//  reference of parentclass
  childclass c1= (childclass )p;// reference of childclass
}

我的问题是,当我们可以使用chlidclass的实例访问数据时,引用子类有什么用?

为什么需要创建子类的参考

我想不出常见的用例。即使假设这只是一个最小的例子(因为你显然永远不会在三行代码中,一个接一个地这样做),如果你发现自己在写这个,这是一个好兆头,表明你没有适当地利用多态性。

为了使像这样的向下转换成功,您必须知道该对象实际上是更派生类的实例。你怎么知道?更具体地说,如何在程序设计中跟踪这些簿记信息?

你必须随身携带标签,上面有告诉你它们的实际类型是什么,这完全颠覆了多态设计的观点,或者你必须尝试一系列向下转换并检查成功/失败,这是乏味的,容易出错的,脆弱的,而且也错过了重点。

诚然,在某些情况下,这是绝对必要的。我能想到的大多数示例都早于 C# 语言中对泛型的支持。

例如,WinForms 事件处理模型。每次引发事件时,它都会将对Object基类的引用传递给事件处理委托。如果委托知道 Object 引用实际上是一个特定的派生类类型,它可以向下转换它并将其用作该类型(例如,如果您正在处理 Button.Click 事件,则可以安全地假定发送对象的类型为 Button )。

但就像我说的,有更好的方法来更好地利用多态性设计,尤其是现在引入泛型。

至于为什么语言支持它,这是一个完全不同的问题,除了语言设计者自己之外,可能无法得到一个好的答案。当然,有一些面向对象的语言可以完全防止向下转换。然而,这是一个非常严格的哲学,设计往往涉及妥协。C# 允许进行这种妥协。

下面的代码解释了它的用法:

class Parent
{
  public void foo(){ Console.WriteLine("Parent foo"); }
  public virtual void foo1() {Console.WriteLine("Parent foo1");}
}
class Child : Parent // class Child extends Parent
{
  public void foo() { Console.WriteLine("Child foo"); }
  public override void foo1(){ Console.WriteLine("Child foo1"); }
}
  public static void Main()
  {
     Child child = new Child();
     Parent parent = new Parent();
     parent = child;// is perfectly valid.
     //child = parent;// is not valid. Error
     parent.foo();
     parent.foo1();
  }

输出将是:父 foo儿童福1