C#:以最少的重复实现接口的抽象基础?

C#:以最少的重复实现接口的抽象基础?,c#,interface,abstract-class,maintainability,C#,Interface,Abstract Class,Maintainability,我经常发现我需要以下几点: public interface IMyThing { void Function1(); void Function2(); void Function3(); void Function4(); void Function5(); } public abstract class BaseMyThing : IMyThing { // Implement a version of Function1, but Fun

我经常发现我需要以下几点:

public interface IMyThing
{
    void Function1();
    void Function2();
    void Function3();
    void Function4();
    void Function5();
}

public abstract class BaseMyThing : IMyThing
{
    // Implement a version of Function1, but Function 2-5 is up to the concrete class to do
    public void Function1()
    {
        // Do stuff.
    }

    public virtual void Function2();
    public virtual void Function3();
    public virtual void Function4();
    public virtual void Function5();
}

public class ConcreteMyThing : BaseMyThing, IMyThing
{
    public new void Function2() { /* something */ }
    public new void Function3() { /* something */ }
    public new void Function4() { /* something */ }
    public new void Function5() { /* something */ }
}

这变得相当烦人——每次我向接口添加一些东西时,我都必须将其存根到抽象类中。这还不是世界末日,但我很好奇我在这里做的事情是否不太理想——这里有没有更好的方法来获得共享代码位的部分功能?

如果从接口派生基类不适合您的情况,请考虑一下


您不需要从接口派生基类。只需在派生类中提供共享功能并实现接口(接口将自动从基类中提取匹配方法)。

我假设Function2到Function5不在基类中使用,而是在派生类中使用。然后它不应该被添加到
IMyThing
,而是应该每个都有一个单独的接口

例如:

public interface IMyThing
{
    void Function1();
}

public abstract class BaseMyThing : IMyThing
{
    // Implement a version of Function1, but Function 2-5 is up to the concrete class to do
    public void Function1()
    {
        // Do stuff.
    }
}

public interface IMyThingConcrete{
  void FunctionConcrete();
}

public class ConcreteMyThing : BaseMyThing, IMyThingConcrete
{
    public void FunctionConcrete() { /* something */ }
}
此外,您不需要在ConcreteMyThing中重新实现IMyThing,它已经实现了IMyThing,因为它继承了BaseMyThing

从Concrete Mything访问FunctionConcrete的示例:

public void AccessFunctionConcrete(IMyThingConcrete myThing){
  myThing.FunctionConcrete();
}

我看不出有任何理由在
BaseMyThing
中实现
IMyThing

public interface IMyThing
{
    void Function2();
    void Function3();
    void Function4();
    void Function5();
}

public abstract class BaseMyThing
{
    public void Function1() {}
}

public class ConcreteMyThing : BaseMyThing, IMyThing
{
    public void Function2() { }
    public void Function3() { }
    public void Function4() { }
    public void Function5() { }
}

你为什么需要我的东西?BaseMyThing似乎定义了相同的接口。还要注意,抽象类中未实现的方法应该标记为
abstract
,而不是
virtual
,并且派生类中的实现应该标记为
override
,而不是
new
。还有为什么要使用new关键字而不是override?请注意,一些编码标准会告诉您为创建的每个抽象类定义一个接口(例如IDesign)。在这种情况下,命名会比较混乱<代码>基本神话什么都做
IMyThing
什么都不做?另外,当在代码中为变量使用接口类型时,您将无法访问
Function1
,这可能是一个问题。OP没有说明任何有关用例的内容,因此,考虑是不必要的。关于命名-这只是一个示例。我不会说没有必要在完整的答案中强调优点和缺点。这能解决重复问题吗?对情况比以前好吗?不。@Thorarin:当然更好。同样,如果没有用例,你无法回答更具体的问题。为了不让消费代码变得混乱,我建议
接口imythingcontracte:IMyThing
,这样你仍然可以访问
功能1
,而无需强制转换。我很难理解IMyThing和imythingcontracte的要求。我同意将
IMyThing
继承到
imythingcontracte
,但如果域不同,则会导致代码气味。