C#方法,可以选择由子类实现,而无需基本方法

C#方法,可以选择由子类实现,而无需基本方法,c#,syntax,C#,Syntax,我有强迫症代码,所以请容忍我 我们有一个基类,具有: virtual protected void OnHierarchyInitialized() { } 现在,当有人重写此方法时,几乎可以期望他们调用基本方法: protected override void OnHierarchyInitialized() { base.OnHierarchyInitialized(); } 但是。。基本方法中没有发生任何事情。将来也不会。我只是不想让那个子类的人在需要调用基方法时“担心”。 另

我有强迫症代码,所以请容忍我

我们有一个基类,具有:

virtual protected void OnHierarchyInitialized()
{
}
现在,当有人重写此方法时,几乎可以期望他们调用基本方法:

protected override void OnHierarchyInitialized()
{
    base.OnHierarchyInitialized();
}
但是。。基本方法中没有发生任何事情。将来也不会。我只是不想让那个子类的人在需要调用基方法时“担心”。 另外:这是实现代码中丑陋的脂肪,它分散了代码的其他部分,这些代码看起来像蒙娜丽莎的C版本

当然,我可以把它变成一个
抽象的
方法,但是这里有一个很大的缺点,那就是它需要实现。也把我的艺术作品搞砸了

问题

在虚方法和抽象方法之间是否存在某种东西,它告诉我们:

选择性地覆盖我,但没有可调用的基本方法

提前谢谢

在c#中没有关键字可以做到这一点<代码>虚拟
是此方法的最佳选择

只是不必担心是否有基类实现。实现派生类的人不应该担心它

只有一个问题:当前的实现是否完全取代了基类的实现

如果有,不要调用基类。如果没有:调用它。

在c#中没有关键字可以这样做<代码>虚拟
是此方法的最佳选择

只是不必担心是否有基类实现。实现派生类的人不应该担心它

只有一个问题:当前的实现是否完全取代了基类的实现


如果有,不要调用基类。如果没有:调用它。

可以肯定的是,您唯一能做的就是使用内置的XML文档通知调用方。例如,这是覆盖您的方法的人将看到的方式:


可以肯定的是,您唯一能做的就是使用内置的XML文档通知调用者。例如,这是覆盖您的方法的人将看到的方式:


如果您的代码如下所示:

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
事件

如果您的代码如下所示:

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
事件

如果您绝对确定基本方法实际上不会做任何事情,那么
抽象方法就是正确的方法。我知道你说这会把你的艺术作品搞砸,但你可以这样想:你想要一种明确告诉用户基本方法什么都不做的方法。一个
abstract
方法将实现这一点,同时提醒他们该方法存在,即使他们选择不使用它


想想接口是如何工作的——它们是一组抽象方法,它们什么都不做,但必须被重写。这是正确的方法,并通过强制包含该方法来称赞您的艺术作品。空方法向用户显示,他们可以连接到
OnHierarchyInitialized
方法以实现某些目标。

如果您绝对确定基本方法实际上不会做任何事情,那么
抽象方法就是正确的方法。我知道你说这会把你的艺术作品搞砸,但你可以这样想:你想要一种明确告诉用户基本方法什么都不做的方法。一个
abstract
方法将实现这一点,同时提醒他们该方法存在,即使他们选择不使用它


想想接口是如何工作的——它们是一组抽象方法,它们什么都不做,但必须被重写。这是正确的方法,并通过强制包含该方法来称赞您的艺术作品。空方法向用户显示,他们可以挂接到
OnHierarchyInitialized
方法以实现某些功能。

如果基本方法不起作用,您为什么担心他们调用或不调用它呢?这会让使用起来有点混乱,因为您必须“思考”基本方法中可能发生的情况。这违反了我的强迫症。我们这里说的是完美主义!所以问题是:我不想让子类化它的人担心它。那么把它放在文档中(XML文档?)我认为这是基于一个“如果重写,必须始终调用基类的方法”规则-它实际上并不存在。如果基本方法不起作用,你为什么担心他们调用或不调用它?这会让使用起来更混乱,因为你必须“思考”基本方法中可能发生的事情。这违反了我的强迫症。我们这里说的是完美主义!所以问题是:我不想让子类化它的人担心它。那么把它放在文档中(XML文档?)我认为这是基于一个“如果重写,则必须始终调用基类的方法”规则——这是不存在的。最后一个问题是一个(理论上不必要的)我试图为子类的作者解决的问题。我们这里说的是静态完美主义;)最后一个问题是一个(理论上不必要的)问题,我试图为子类的作者摆脱这个问题。我们这里说的是静态完美主义;)