基类对象是否包含派生类对象?

时间:2013-09-24 09:54:37

标签: c# inheritance abstract-class

以下是代码,我想了解一些事情:

public class Test {
    public void dosomething( ) {
      Derived2 d2 = new Derived2 () ;
      Base bobject = d2;
      string str = "str" ;
      bobject.Method1( str ); // I want to call Method1 of Derived1 class
    }
  }

  public class Derived2 : Derived1 {
    public void Method1( string s ) {

    }
  }

  public class Derived1 : Base {
    public override void Method1( double d ) {

    }

    public override void Method2( double d ) {

    }
  }

  public abstract class Base {
    public abstract void Method1( double d );
    public abstract void Method2( double d );
  }

我想知道,当我们将派生类对象分配给基本抽象类对象时会发生什么。我知道实例化抽象类是不可能的。在我的例子中,我派生类 Derived1 并将 Derived2 类的对象分配给基础抽象类对象。现在我想访问接受字符串参数的 Dervied2 类方法 Method1 。不知何故,我无法访问此方法。存在多个从基本抽象类派生的类。我想保持通用。

3 个答案:

答案 0 :(得分:1)

  

当我们将派生类对象分配给基本抽象类对象

时会发生什么

您的代码中没有对象分配,变量分配。 赋值后,变量bobject引用与d2相同的对象。对象类型(以及对象状态中的任何内容)保持不变。

  

现在我想访问接受字符串参数

的Dervied2类方法Method1

如果不将bobject转换为Derived2,您就无法在样本中执行此操作:

((Derived2)bobject).Method1(str)

  

我想保持通用

然后,您不应该尝试访问不属于基类的成员。

答案 1 :(得分:0)

bobjectBase的一种类型,有两种接受double的方法,而不是字符串(该方法在Derived2的实现中定义)。

为了满足您的需求,您需要将bobject投射到Derived2,例如:

var d3 = bobject as Derived2;
d3.Method1("String");

答案 2 :(得分:0)

你甚至可以做到

(bobject as Derived2).Method1(string);

这是因为分辨率基于变量类型。