我有三个类使用了一个通用接口。但是在一个类中,除了接口定义的函数之外,我还有一个函数(附加函数())。假设这个接口类型引用作为参数传递给服务层方法,如果我必须调用附加函数,那么我应该怎么做?(即我已经进行了接口驱动设计,而我有90%的相似性但是在10%的变化中(像一个额外的函数())。设计好吗?或者我们应该尝试抽象类或其他。请建议..........
答案 0 :(得分:0)
为附加功能创建另一个接口 - 您可以让一个类实现多个接口。
在需要时让您的服务层使用此附加界面。
答案 1 :(得分:0)
如果你有代码:
void Op(IMyInterface x)
{
x.This();
x.That();
}
你可以这样做:
void Op(IMyInterface x)
{
x.This();
x.That();
var y = x as SpecialClass;
if(y != null)
{
y.TheOther();
}
}
虽然IMO有点乱 - 如果你粘贴一些代码我们可能会帮你更多。
答案 2 :(得分:0)
要回顾Alex的答案,您可以使用额外的方法定义名为IMyOtherInterface的第二个接口。然后做这样的事情:
void Op(IMyInterface x, IMyOtherInterface y) {
x.This();
x.That();
if(y != null) {
y.TheOther();
}
}
当您调用该方法时,如果您的类实现了两个接口,则可以将其传递两次。否则只需一次。你的实现没有理由知道它是实现两个接口的同一个类。如果您使用的是VB或4.0 C#,则可以将第二个参数标记为“可选”。
第三种选择是将你的额外方法添加到你的原始界面,但是把它称为“DoFinalization()”之类的更通用的东西,让你的实现类只有一个空的实现,除了那个你需要它的特殊情况
答案 3 :(得分:0)
所以你真的有两个接口,其中一个实现了另一个接口。
public interface IMyInterfaceA
{
void Method1();
void Method2();
}
public interface IMyInterfaceB: IMyInterfaceA
{
void ExtraMethod();
}
然后,您的服务层方法应该接受IMyInterfaceA或IMyInterfaceB,具体取决于它们是否需要ExtraMethod。
如果你有一个方法可以接受IMyInterfaceA但是如果IMyIntefaceB可用则可以做一些“特殊”的事情然后你可以使用反射(或者只是'as'运算符),或者更好的是仍然只提供2个重载版本的编译器应该在适当的时候解析对IMyInterfaceB的调用。
答案 4 :(得分:0)
感谢您的回复。但是,我的一位主管研究了服务层级语法,如 var y = x as SpecialClass; ,并表示这不是一个好的设计方法。他建议我在业务经理级别使用工厂,然后进行这种铸造。