【问题标题】:Does base class object holds the drived class object?基类对象是否包含派生类对象?
【发布时间】:2013-09-24 09:54:36
【问题描述】:

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

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

【问题讨论】:

标签: c# inheritance abstract-class


【解决方案1】:

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

你的代码中没有 object 赋值,有 variable 赋值。 赋值后,变量bobject 指向同一个对象,就像d2 一样。对象类型(以及对象状态中的任何内容)保持不变。

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

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

((Derived2)bobject).Method1(str)

我想保持通用性

那么,你不应该尝试访问不属于基类的成员。

【讨论】:

  • 正如您提到的“赋值后,变量 bobject 引用同一个对象,就像 d2 一样。对象类型(以及对象状态中的任何内容)保持不变”。那为什么我不能访问 Derived2 的 Method1 呢?
  • 因为 variable 的类型(不是 object 的类型,那个变量指的是!)是Base。由于Base 不包含所需的方法,因此您无法访问它。
【解决方案2】:

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

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

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

【讨论】:

  • bobject = new Derived1(); var d3 = bobject as Derived2; d3.Method1("String"); - 调试愉快。
【解决方案3】:

你甚至可以这样做

(bobject as Derived2).Method1(string);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多