.Net不允许在基类中部分实现接口。为了缓解这个问题,我提出了三种备选方案。请帮我决定哪个更具通用性,以便于重构、编译/运行时错误和可读性。
- 当然,您可以始终将对象强制转换为IFoo,并调用任何方法,而没有任何编译器警告。但这是不合逻辑的,您通常不会这样做。这个构造不会作为重构的结果出现。
- 我希望最大限度地分离。直接类契约(公共方法和属性)应该与接口实现分开。我经常使用接口来分隔对象交互。
我的比较:
- BaseClass1/MyClass1:
- 缺点: 必须为每个未实现的IFoo方法在BaseClass1中创建虚拟抽象方法。
- 缺点: 额外的方法包装 - 运行时稍微有些影响生产率。
- BaseClass2/MyClass2:
- 缺点: 如果MyClass2中没有实现Method2,则没有编译器警告,而是运行时异常。重构覆盖单元测试差的情况下可能会导致潜在的代码不稳定。
- 缺点: 必须添加陈旧的构造来防止从子类中直接调用方法。
- 缺点: Method2是BaseClass1的公共方法,因此现在它是类契约的一部分。必须使用"Obsolete"构造来防止直接调用,而不是通过IFoo调用。
- BaseClass3/MyClass3:
- 优点: (与#2相比)更易读。您可以看到MyClass2.Method2是IFoo实现,而不仅仅是某个覆盖的方法。
public interface IFoo
{
void Method1();
void Method2();
}
public abstract class BaseClass1 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
IFooMethod2();
}
protected abstract void IFooMethod2();
}
public class MyClass1 : BaseClass1
{
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
protected override void IFooMethod2()
{
//some implementation
}
}
public abstract class BaseClass2 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
public virtual void Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass2 : BaseClass2
{
public override void Method2()
{
//some implementation
}
}
public abstract class BaseClass3 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass3 : BaseClass3, IFoo
{
void IFoo.Method2()
{
//some implementation
}
}
IFoo
的变量,你真的期望所有IFoo
接口的方法都已经实现并可用。接口就是为此而设计的。 - ken2k