【问题标题】:Is there a pattern for extending a base class with children that implements an interface? [closed]是否有使用实现接口的子类扩展基类的模式? [关闭]
【发布时间】:2017-05-01 15:58:43
【问题描述】:

假设我有 2 个实现相同接口的类:

public interface IDoSomething
{
    void DoSomething();
}

public class Child1
{
    private const int CONST1 = 0;

    void IDoSomething.DoSomehting()
    { /*Do something the way a Child1 would*/ }
}

public class Child2
{
    private const int CONST1 = 0;

    void IDoSomething.DoSomehting()
    { /*Do something the way a Child2 would*/ }
}

我想知道的是,既然两个类都使用相同的常量 (CONST1),我是否应该创建一个新类:

public class Parent
{
    private const int CONST1 = 0;
}

然后让Child1Child2 继承自该类,假设此场景中的真实类更大(通过接口实现多个常量和多个函数)?

【问题讨论】:

  • 您可以将父类声明为抽象类,然后将常量标记为受保护。然后可以将父类中的接口方法标记为抽象,强制子类实现。
  • 你不需要从一个类继承来使用一个常量。你可以从另一个不相关的类中访问一个常量,只要它是公共的。
  • @willaien 你的评论似乎很有道理
  • 你可以让两个孩子都实现接口,或者你可以让父母抽象并实现它——但我真的只是想提一下,你可能陷入了我多年来所做的一个陷阱前。尽管了解/理解这些问题很好,但我建议您避免继承,除非很明显您需要它。常用的短语是“优先组合胜过继承”。
  • @Sebastien 它不必在任何一个上,它可以完全在其他地方。如果值在概念上不同,那么您不应该希望对两者使用相同的标识符。如果它在概念上相同的值,那么找到一个可以容纳它的地方,以存放任何可能需要它的东西。

标签: c# oop design-patterns


【解决方案1】:

继承 - NO.

在以下情况下继承是一个不错的选择:

  • 您的继承层次结构表示“is-a”关系,而不是“has-a”关系。
  • 您可以重用基类中的代码。
  • ...

来源 - https://msdn.microsoft.com/en-us/library/27db6csx(v=vs.90).aspx

条件 #1 在您的情况下立即失败,因为您的子类“具有”常量。

条件 #2 可能会让您想到 Parent,但请记住,在决定继承时,条件 #1 仍然应该是优先事项。 #2 中的重用代码是指重用父类的行为,而不仅仅是字段。

我认为您帖子中的 cmets 已经让您走上了正轨。我就在这里巩固一下。

public interface IDoSomething {
    void DoSomething();
}

public class Constants {
    private Constants() {}
    public const int CONST1 = 0;
}

public class Class1 : IDoSomething {
    public void DoSomething() { 
        Console.Write(Constants.CONST1);
    }
}

【讨论】:

  • Aaaaaahhhh,这是 Servy 在顶部评论中试图让我弄清楚的吗?
  • 是的!没错。
猜你喜欢
  • 2013-09-25
  • 2019-04-07
  • 2017-03-14
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多