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
,但如果域不同,则会导致代码气味。