C#方法,可以选择通过子类实现,不需要基本方法

时间:2014-09-22 10:13:20

标签: c# syntax

我有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

提前致谢!

4 个答案:

答案 0 :(得分:2)

非常确定您唯一能做的就是使用内置的XML文档来通知调用者。例如,这就是覆盖方法的人的表现方式:

XML Documentation

答案 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方法以实现某些目的。