1

下面是代码,我想了解几件事:

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 。不知何故,我无法访问此方法。存在多个从基本抽象类派生的类。我想保持通用性。

4

3 回答 3

1

当我们将派生类对象分配给基本抽象类对象时究竟会发生什么

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

现在我想访问接受字符串参数的 Dervied2 类方法 Method1

bobject如果不强制转换为,您将无法在示例中执行此操作Derived2

((Derived2)bobject).Method1(str)

我想保持通用

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

于 2013-09-24T10:01:01.557 回答
0

bobject是一种类型,Base它有两个接受双精度的方法,而不是字符串(该方法在Derived2的实现中定义)。

要执行您需要转换bobject为 Derived2 的操作,例如:

var d3 = bobject as Derived2;
d3.Method1("String");
于 2013-09-24T10:05:48.437 回答
0

你甚至可以做

(bobject 作为 Derived2).Method1(string);

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

于 2013-09-24T10:36:04.283 回答