假设我有两个类,parentclass和childclass,而childclass继承父类
class childclass : parentclass
{
childclass c = new childclass(); //instance
parentclass p = c ;// reference of parentclass
childclass c1= (childclass )p;// reference of childclass
}
我的问题是,当我们可以使用chlidclass的实例访问数据时,对子类的引用有什么用?
答案 0 :(得分:3)
没有我能想到的常见用例。即使假设这只是一个最小的例子(因为你显然从不在三行代码中执行此操作,一个接一个地执行此操作),如果您发现自己编写此代码,则它是一个好的迹象表明你是not taking proper advantage of polymorphism。
为了使像这样的向下转发成功,你必须知道该对象实际上是更多派生类的实例。你怎么知道?更具体地说,您如何在程序设计中跟踪此簿记信息?
你必须携带带有对象的标签,告诉你它们的实际类型是什么,这完全颠覆了多态设计的要点,或者你必须尝试一系列向下转发并检查成功/失败,这是单调乏味,容易出错,脆弱,也缺乏重点。
不可否认,有可能存在绝对必要的情况。我能想到的大多数例子早于在C#语言中引入对泛型的支持。
例如,WinForms事件处理模型。每次引发事件时,它都会将对Object
基类的引用传递给事件处理委托。如果委托知道对象引用实际上是特定的派生类类型,它可以向下转换它并将其用作该类型(例如,如果你是这样的话)处理Button.Click
事件时,您可以安全地假设发送对象的类型为Button
)。
但正如我所说,有更好的方法可以更好地利用多态设计,特别是现在引入泛型。
至于语言为什么支持它,这是一个完全不同的问题,可能是一个除了语言设计者自己以外无法得到好答案的问题。肯定有面向对象的语言可以完全阻止向下转型。然而,这是一个相当严格的哲学,设计往往涉及妥协。 C#允许进行妥协。
答案 1 :(得分:0)
下面的代码解释了它的用法:
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 孩子foo1