不同的类必须以完全相同的方式实现接口方法

时间:2016-03-03 09:42:09

标签: c# interface

我有和界面定义了一堆不同的属性和 State 属性,它是所有其他属性的紧凑摘要。

所以我有一个名为IStateful

的通用接口
interface IStateFul
{
    string State { get; set; }
}

我有一些以不同方式实现此接口的类 - 一个要求用户输入,另一个从服务读取值,一个可以从DB获取数据。 但是他们所有人都必须以完全相同的方式计算状态以便彼此“兼容”。因此,不同类中State的实现必须以完全相同的方式使用其他属性来计算状态字符串。

截至今天,我将状态实现方法从一个类复制并粘贴到另一个类中。这显然是最糟糕的选择。

其他选项可能是

  • 常见的抽象基类(我试过这个并且它很笨拙,抽象类必须抽象地实现它根本不关心的所有接口方法,然后派生类必须全部覆盖它们)
  • 另一个要调用静态方法的类(“序列化程序”???)
  • 界面的扩展方法(与选项2相同,但具有不同的辛二糖)

有一个共同的模式可以遵循?或者是否有一个我不想看到的基本设计缺陷?

3 个答案:

答案 0 :(得分:2)

在抽象类中,您只应将需要的方法标记为abstract,否则请将它们标记为virtual

public abstract class MyBase
{
    protected virtual void DoSomething()
    {
        //My Implementation here
        Console.WriteLine("Base implementation");
    }

    //Will give compile-time error if you don't override this in derived class
    protected abstract void DoSomethingElse();
}

然后在派生类中,您可以使用虚方法的基本实现或覆盖它们,并且需要实现抽象方法:

public class Derived : MyBase
{
    protected override void DoSomethingElse()
    {
        Console.WriteLine("Derived implementation");
    }
}

public static void Main(String[] args)
{
    var derived = new Derived();
    derived.DoSomething();      //Base Implementation
    derived.DoSomethingElse();  //Derived implementation
}

答案 1 :(得分:1)

如果您的设计并非绝对需要使用接口,则可以使用接口的抽象类而不是,而不能同时使用两者。它几乎可以以相同的方式工作,但允许您定义方法/属性实现。

您的案例是抽象类解决的常见模式。

答案 2 :(得分:0)

我会定义接口IRequireState

public interface IRequireState
{
    bool GetState();
}

并将其用于所有需要国家的课程。有一个名为“The Interface Segregation Principle”(ISP)的编程原则,它基本上表明你应该只在有意义的类中实现一个接口。

根据Open Closed Principle,您总是可以删除衍生物,例如,如果您有3个类,那么所有实现IRequireState的类都可以输入如下代码:

foreach(var job in myListOfJobs)
  if(job.GetType() == typeof(IRequireState))
    ((IRequireState)job).GetState();

我希望这可以帮助您实现良好的面向对象设计。请务必阅读SOLID principles。他们帮助解决了这些问题。

如果你有一些工作做同样的GetState()事情,那么有一个基类实现相同的接口是有意义的,但你可以自由地拥有各种不同的GetState()作业的实施方式。