1

我经常发现我需要以下内容:

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 */ }
}

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

4

3 回答 3

2

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

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

于 2013-04-04T05:22:45.227 回答
1

我看不到任何实施IMyThingin 的理由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() { }
}
于 2013-04-04T05:32:51.543 回答
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();
}
于 2013-04-04T05:25:54.037 回答