为什么需要创建子类的参考
本文关键字:参考 子类 创建 为什么 | 更新日期: 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