为什么需要创建子类的引用?

时间:2016-01-26 05:16:44

标签: c#

假设我有两个类,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的实例访问数据时,对子类的引用有什么用?

2 个答案:

答案 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