我有和界面定义了一堆不同的属性和 State 属性,它是所有其他属性的紧凑摘要。
所以我有一个名为IStateful
interface IStateFul
{
string State { get; set; }
}
我有一些以不同方式实现此接口的类 - 一个要求用户输入,另一个从服务读取值,一个可以从DB获取数据。
但是他们所有人都必须以完全相同的方式计算状态以便彼此“兼容”。因此,不同类中State
的实现必须以完全相同的方式使用其他属性来计算状态字符串。
截至今天,我将状态实现方法从一个类复制并粘贴到另一个类中。这显然是最糟糕的选择。
其他选项可能是
有一个共同的模式可以遵循?或者是否有一个我不想看到的基本设计缺陷?
答案 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()作业的实施方式。