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

C# 不同的类必须以完全相同的方式实现接口方法,c#,interface,C#,Interface,我有一个接口定义了一堆不同的属性和一个状态属性,它是所有其他属性的一个紧凑的总结 因此,我有一个名为IStateful interface IStateFul { string State { get; set; } } 我有一些类以不同的方式实现这个接口——一个请求用户输入,另一个从服务读取值,一个可以从数据库获取数据。 但它们都必须以完全相同的方式计算状态,才能彼此“兼容”。因此,不同类中的State的实现必须以完全相同的方式使用其他属性来计算状态字符串 到今天为止,我将状态实现方

我有一个接口定义了一堆不同的属性和一个状态属性,它是所有其他属性的一个紧凑的总结

因此,我有一个名为
IStateful

interface IStateFul
{
    string State { get; set; }
}
我有一些类以不同的方式实现这个接口——一个请求用户输入,另一个从服务读取值,一个可以从数据库获取数据。 但它们都必须以完全相同的方式计算状态,才能彼此“兼容”。因此,不同类中的
State
的实现必须以完全相同的方式使用其他属性来计算状态字符串

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

其他选择可能是:

  • 公共抽象基类(我尝试了这个,它是ankward,抽象类必须抽象地实现它根本不关心的所有接口方法,然后派生类必须重写它们)
  • 另一个具有要调用的静态方法的类(“序列化程序”?)
  • 接口的一种扩展方法(与选项2相同,但不同)

有一个共同的模式可以遵循吗?还是有一个我没有看到的基本设计缺陷?

在一个抽象类中,您应该只将需要重写的方法标记为
抽象
,否则将它们标记为
虚拟

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
}

在抽象类中,只应将需要重写的方法标记为
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
}

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


您的案例是抽象类处理的常见模式。

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


您的案例是由抽象类处理的常见模式。

我将定义接口IRequireEstate

public interface IRequireState
{
    bool GetState();
}
并将其用于所有需要状态的类。有一个称为“”(ISP)的编程原则,它基本上规定您应该只在有意义的类中实现接口

根据,您始终可以替换一个派生,因此,例如,如果您有3个类,所有这些类都实现了iRequestEstate,那么您可以键入如下代码:

foreach(var job in myListOfJobs)
  if(job.GetType() == typeof(IRequireState))
    ((IRequireState)job).GetState();
我希望这能帮助您实现良好的面向对象设计。一定要仔细阅读报告。他们在这些问题上帮助很大


如果您有一些作业执行相同的GetState()操作,那么有一个实现相同接口的基类是有意义的,但是您也可以自由地拥有具有各种不同GetState()实现的作业。

我将定义接口IRequireEstate

public interface IRequireState
{
    bool GetState();
}
并将其用于所有需要状态的类。有一个称为“”(ISP)的编程原则,它基本上规定您应该只在有意义的类中实现接口

根据,您始终可以替换一个派生,因此,例如,如果您有3个类,所有这些类都实现了iRequestEstate,那么您可以键入如下代码:

foreach(var job in myListOfJobs)
  if(job.GetType() == typeof(IRequireState))
    ((IRequireState)job).GetState();
我希望这能帮助您实现良好的面向对象设计。一定要仔细阅读报告。他们在这些问题上帮助很大


如果您有一些作业执行相同的GetState()操作,那么有一个实现相同接口的基类是有意义的,但是您也可以自由地拥有具有各种不同GetState()的作业实现。

您的示例抽象类没有实现接口。请在抽象类中实现它们谢谢您的回答,但我不知道这与我所做的有什么关系asking@edc65如果希望基类中的某些接口有一个通用实现,可以使用抽象类来实现。显然,您必须重写它们在派生类中没有共同点的那些?我不认为我真的理解你的问题你的示例抽象类没有实现接口。在抽象类中实现它们谢谢你的回答,但我不知道这与我所说的有什么关系asking@edc65如果希望基类中的某些接口有一个通用实现,可以使用抽象类来实现。显然,您必须重写它们在派生类中没有共同点的那些?我不认为我真的理解你的问题我知道我是自由的,但我需要被约束。我在问题中补充了一些细节,添加这些约束是一个很好的做法。坚实的原则或多或少使您避免代码重复,并遵循更严格、更有纪律、易于阅读、维护和理解的代码:)我知道我是自由的,但我需要约束。我在问题中补充了一些细节,添加这些约束是一个很好的做法。坚实的原则或多或少使您避免了代码重复,并遵循更严格、更规范、易于阅读、维护和理解的代码:)我可以轻松地在类中实现接口。我不能中断类层次结构来添加基本抽象类。我需要使用组合并添加一个派生自基本抽象类的成员,而不是。。。正如我所说,这是ankw