实现接口的类有一些额外的功能,那么如何处理呢?

时间:2010-07-10 12:50:08

标签: asp.net oop interface

我有三个类使用了一个通用接口。但是在一个类中,除了接口定义的函数之外,我还有一个函数(附加函数())。假设这个接口类型引用作为参数传递给服务层方法,如果我必须调用附加函数,那么我应该怎么做?(即我已经进行了接口驱动设计,而我有90%的相似性但是在10%的变化中(像一个额外的函数())。设计好吗?或者我们应该尝试抽象类或其他。请建议..........

5 个答案:

答案 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; ,并表示这不是一个好的设计方法。他建议我在业务经理级别使用工厂,然后进行这种铸造。