Tip*_*ipx 5 c# methods virtual abstract-class overriding
有这样的事情:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我读了另一篇文章(虚拟课堂中的抽象方法)女巫很像我的问题,但是有一点不同.我希望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
}
}
Run Code Online (Sandbox Code Playgroud)
我也可以创建一个IAAA接口并构建我的BBB类
public class BBB : AAA, IAAA { ... }
Run Code Online (Sandbox Code Playgroud)
但是看起来不对我.
你的方法是基本正确的方式...
编辑:
你的"规范"是:
现在,由于您似乎希望始终执行"默认行为",因此您需要
public string ToString()
{
// placeholder for some default behaviour
string result = doToString();
// placeholder for some more default behaviour
return result;
}
protected abstract string doToString();
Run Code Online (Sandbox Code Playgroud)
这只有在您知道基类正在执行的操作并且希望doToString()在派生类中提供实现时才有效.这称为模板方法设计模式.
但是,如果您正在寻找一种方法来要求派生类的实现者base.ToString()在其实现中调用ToString(),那么就没有办法做到这一点.通过允许覆盖,您可以为其实现提供派生类控件.
您可以将您的建议记录为始终致电base.ToString(),但就是这样.
使用接口定义您的类的公共合同.与模板方法模式相比,这不会带来任何额外的好处,因为您仍需要从基类派生以获得"默认"实现.
您是否有任何有关您尝试在基类中提供的"默认行为"的详细信息?也许这将有助于找到更好的解决方案.看看引用的问题,这基本上是相同的方法.
| 归档时间: |
|
| 查看次数: |
6547 次 |
| 最近记录: |