【问题标题】:Force One of Two Method Implementations In A Child Class强制子类中的两种方法实现之一
【发布时间】:2012-03-28 10:37:57
【问题描述】:

我在这样声明的基类中有一个抽象方法...

public abstract void StartHere();
public virtual void StartHere(string flag)
{   
    switch(flag)
    {
        default : StartHere(); break;
    }
}

有什么办法可以改变它,让继承的子类强制实现一个或另一个,但不能同时实现?目前子类被强制只实现 StartHere()。

您还说让默认虚拟方法指向无参数抽象是一种好的做法吗?还是这毫无意义?

此方法的作用是设置类,程序员可以使用 StartHere() 进行简单设置,也可以使用标志 StartHere(string) 进行更复杂的设置。

谢谢!

【问题讨论】:

  • 你给客户端程序员太多的绳索让他上吊。自信地编程,负责你应该照顾的部分,不要让其他人来解决它。将 StartHere(string) 设为私有。

标签: c# methods implementation abstract


【解决方案1】:

通常,无参数函数通过传递默认值来调用参数函数是明智的。这称为函数链接。

【讨论】:

  • 所以你说 startHere() 应该调用 startHere("default") ......但是它不能是抽象正确的。我希望这种方法是抽象的以强制其实施。
  • 是的。您可以将 startHere 与最大参数数量保持抽象。或者公开设置类属性的方法,这些属性将充当输入参数,并让 startHere 使用这些属性/属性
  • 我仍然不确定我是否理解如何强制使用两种抽象方法中的一种,但我在我的另一种类似方法中颠倒了调用的顺序。谢谢!
  • 您不能强制使用两种抽象方法之一。但是您可以只保留参数化方法的抽象,并将参数较少的方法保留为虚拟。这种方式派生类可以覆盖并在需要时提供特定的实现,并且必须实现参数化的。
  • 感谢您的澄清,我想这就是我正在做的事情......但反过来......出于我的目的,参数化方法可能不是那么必要的方法。跨度>
【解决方案2】:

我更喜欢不同的设计,例如:

public void StartHere();
public virtual void StartHere(string flag)
{
    StartHere();
}

因为在这种情况下,父类和子类更加松散耦合:父类不必知道只有子类感兴趣的 *标志*s在。

如果由于某种原因你必须遵循当前的设计,我建议你至少更改以下几行:

    switch(flag)
    {
        default : StartHere(); break;
    }

类似于:

    switch(flag)
    {
        "DEFAULTFLAG" : StartHere(); break;
        default : throw ArgumentException(
            String.Format("Unrecognized flag '{0}'!", flag)
            );
    }

当你错误地设置了错误的标志时,你更容易捕捉到意外的错误。

【讨论】:

  • 感谢您的建议,我已经更新了我的开关。并且可以考虑将其全部删除。
最近更新 更多