让我们假设我们有以下代码:
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。这不是一个功课问题。我只是想知道。
答案 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()中所需的额外信息。