基本方法是否能够使用派生的基础数据成员?

时间:2010-03-17 13:31:03

标签: c#

让我们假设我们有以下代码:

abstract class Base1 {
    protected int num;
}

class Der1:Base1 {
    protected Color color;
    protected string name;
}

class Der2:Base1 {
    protected DateTime dthen;
}

等等。存在base1类型的数组,其中包含从base1派生的类中创建的许多对象。

是否可以仅在基类中定义toString()方法? 类似的东西:

public override string toString()
{
    if (this is Der1)
        return "num = " + this.num + "color = " + this.color.toString() + " name = " this.name;
    if (this is Der2)
        return "num = " + this.num + "dthen = " + this.dthen.toString();
    // and so on ...
}

非常感谢:)

P.S。这不是一个功课问题。我只是想知道。

5 个答案:

答案 0 :(得分:6)

执行此操作的唯一方法是将this强制转换为每个派生类型。 (即使这样,只有在成员公开的情况下才有效)

但是,确实应该覆盖该方法。

答案 1 :(得分:4)

不,除非您将所有成员的字段访问修饰符更改为public,否则这是不可能的。

一般而言:这是一种不好的做法。基类不应该知道派生类的任何内容。

答案 2 :(得分:1)

有可能,但是

  • 派生类成员应公开
  • 您缺少明确的强制转换

    public override string toString() {     if(这是Der1)         返回“num =”+((Der1)this).num + // etc ...

顺便说一句,这是非常糟糕的,因为你应该在派生类Der1和Der2中重写ToString - 这就是polimorphism的用途。

答案 3 :(得分:1)

您应该让派生类处理其ToString版本的行为方式。

让基类依赖于所有派生类,这使得设计非常脆弱。

答案 4 :(得分:0)

看起来你要避免的是复制抽象基类中的代码,该类在ToString()中打印其信息。您可以使用基类中的虚方法解决此问题,例如GetExtraString(),它在后代类中被重写,只返回您在基础ToString()中所需的额外信息。