有这样的事情:
public abstract class AAA
{
protected abstract virtual string ToString() // Error
{
// Base Stuff
}
}
public abstract class BBB : AAA
{
public override string ToString()
{
// Use base.ToString();
// More Stuff
}
}
我读了另一篇文章(abstract method in a virtual class)女巫非常像我的问题,但有一点不同。我希望AAA.ToString()具有基本行为和强制派生类覆盖它。
我知道我可以做这样的事情(向下滚动),但我正在寻找一种正确的方法。
public abstract class AAA
{
public abstract string ToString();
protected string ToString2()
{
// Base Stuff
}
}
public class BBB : AAA
{
public override string ToString()
{
// Use base.ToString2();
// More Stuff
}
}
我也可以创建一个IAAA接口并构建我的BBB类
public class BBB : AAA, IAAA { ... }
但是看起来不对我。
答案 0 :(得分:5)
你的方法 基本上是正确的方式......
编辑:
您的“规范”是:
现在,由于您似乎希望始终执行“默认行为”,因此您需要
public string ToString()
{
// placeholder for some default behaviour
string result = doToString();
// placeholder for some more default behaviour
return result;
}
protected abstract string doToString();
这只有在您知道基类正在执行的操作并且希望在派生类中提供doToString()
的实现时才有效。这被称为Template Method设计模式。
但是,如果您正在寻找一种方法要求派生类的实现者在其base.ToString()
的实现中调用ToString()
,那么就没有办法了这个。通过允许覆盖,您可以为其实现提供派生类控件。
您可以记录您的建议,以便始终致电base.ToString()
,但这就是它。
使用界面定义您班级的公共合同。与模板方法模式相比,这不会带来任何额外的好处,因为您仍需要从基类派生以获得“默认”实现。
您是否有任何有关您尝试在基类中提供的“默认行为”的详细信息?也许这将有助于找到更好的解决方案。看看引用的问题,这基本上是相同的方法。
答案 1 :(得分:2)
我刚刚发现了如何做到我想要的行为:
public abstract class AAA
{
protected abstract string ToStringSpecific();
protected string ToString()
{
// Base Stuff
...
// Use this.ToStringSpecific();
}
}
public class BBB : AAA
{
protected override string ToStringSpecific()
{
// Specific Stuff
}
}
答案 2 :(得分:0)
不,不可能将当前的虚函数转换为抽象函数。执行此操作的唯一方法是创建另一个抽象的函数,如您所建议的那样。这可以说是一种更合适的方法(我同意这一点)。