我有Code OCD,所以请耐心等待。
我们有一个基类:
virtual protected void OnHierarchyInitialized()
{
}
现在当某人覆盖此方法时,他们几乎应该调用基本方法:
protected override void OnHierarchyInitialized()
{
base.OnHierarchyInitialized();
}
但是......基本方法中没有发生任何事情。将来也不会。我只是不想要那些子类需要担心的人。 当和 if 时,他们需要调用基本方法。 另外:在实现代码中这是丑陋的 fat </ em>,这会分散其他看起来像Mona Lisa本身的C#版本的代码。
当然我可以使它成为abstract
方法,但是需要实现的最大缺点是。也搞砸了我的艺术作品。
问题
虚拟和抽象方法之间是否有某种东西可以告诉消息:
override me optionally, but there is no base method to call
?
提前致谢!
答案 0 :(得分:2)
非常确定您唯一能做的就是使用内置的XML文档来通知调用者。例如,这就是覆盖方法的人的表现方式:
答案 1 :(得分:1)
c#中没有关键字可以做到这一点。 virtual
是这种方法的最佳选择。
不要担心是否存在基类实现。实现派生类的人不应该担心它。
只有一个问题:当前的实现是否完全取代了基类的实现?
如果确实如此,请不要调用基类。如果它没有:打电话给它。
答案 2 :(得分:1)
如果您的代码如下所示:
public void Foo()
{
// do something
OnHierarchyInitialized();
// do something else
}
您可能想要考虑事件而不是继承:
public event EventHandler HierarchyInitialized = delegate { };
OnHierarchyInitialized();
public void Foo()
{
// do something
OnHierarchyInitialized(new EventArgs());
// do something else
}
private void OnHierarchyInitialized(EventArgs e)
{
EventHandler handler = HierarchyInitialized;
handler(this, e);
}
如果消费者对它感兴趣,可以订阅HierarchyInitialized
事件。
答案 3 :(得分:1)
如果你完全确定基本方法永远不会真正做任何事情,那么abstract
方法就是正确的方法。我知道你说这会搞砸你的艺术作品,但想想这样:你想要一种明确告诉用户基本方法什么都不做的方法。 abstract
方法将实现此目的,同时提醒他们方法即将存在,即使他们选择不使用它。
考虑接口是如何工作的 - 它们是抽象方法的集合,除了必须被覆盖之外什么都不做。这是正确的方法,并通过强制包含该方法来赞美您的艺术作品。空方法向用户显示他们可以挂钩到OnHierarchyInitialized
方法以实现某些目的。