.net不允许在基类中实现部分接口。作为一种缓解措施,我已经选择了3种备选解决方案。请帮助我确定哪一个更适用于重构,编译/运行时错误,可读性。 但首先有几条评论。C#在基类/抽象类中的最佳部分接口实现
- 当然,您可能总是将对象投射到IFoo并在没有任何编译器警告的情况下调用任何方法。但这不合逻辑,你不会那样做。这个构造不会因重构而发生。
- 我想要最大的分离度。直接类合同(公共方法和属性)应该与接口实现分开。我使用很多接口来分离对象的交互。
我比较:
- BaseClass1/MyClass1的:
- CON:有在BaseClass1创建虚拟抽象的IFoo的每个未实现的方法。
- con:其他方法包装 - 运行时对生产力的影响很小。
- BaseClass2/MyClass2:
- CON:没有编译器警告,如果在MyClass2没有实现方法2的。运行时异常。用单元测试覆盖较差的重构可能会破坏代码的稳定性。
- con:必须放置额外的过时构造来防止子类中的直接方法调用。
- con:Method2对于BaseClass1是公开的,所以它现在是类合同的一部分。必须放置“过时”构造以防止直接呼叫,而不是通过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
}
}
这是一个**非常尴尬的模式,你试图实现。你说*“.NET不允许在基类中实现部分接口。”* - 这是有原因的。客户端代码需要某种**实现接口**,或许...... **实现接口**。对于不支持的方法抛出异常,当然是*非常*糟糕的代码异味... – Yuck 2012-02-07 12:47:47
同意Yuck。如果你有一个'IFoo'类型的变量,你真的希望'IFoo'的所有方法都可以实现并且可用。接口是为了这个。 – ken2k 2012-02-07 12:51:32
只有MyClass1 _必须完全实现接口。它确实如此。问题是有多个子类(我没有提及它),每个都必须实现IFoo。如果没有基类,您必须复制/粘贴Method1实现,这对所有子类都是相同的。这是我想要避免的。但是Method2实现在子类中是不同的,所以我不能只有一个实现Method1和Method2的类。 – user1194528 2012-02-07 13:11:56