C#:实现具有最小重复的接口的抽象基础?

时间:2013-04-04 05:15:27

标签: 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 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 */ }
}

这变得相当烦人 - 每当我向界面添加内容时,我必须在抽象类中将其存根。这不是世界末日,但我很好奇,如果我在这里做一些不太理想的事情 - 是否有更好的方法来获得共享代码位的部分功能?

3 个答案:

答案 0 :(得分:2)

考虑是否从界面派生基类适用于您的情况。

您不需要从界面派生您的基类。只需使它在派生类中提供共享功能和实现接口(匹配方法将通过接口从基类中自动获取)。

答案 1 :(得分:1)

我看不出在IMyThing中实施BaseMyThing的任何理由:

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() { }
}

答案 2 :(得分:0)

我假设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。

从ConcreteMyThing访问FunctionConcrete的示例:

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