我们如何避免冗余接口实现?

时间:2011-04-29 07:50:55

标签: c# architecture interface

我有一个设计问题。 我将提出一个假设的情况。 我的应用程序需要几个接口才能使对象可用。让我们说它们是;

1.  IAdult.cs, with two properties
  a.    Age
  b.    LicenceNo.
2.  IEducated.cs, with two methods
  a.    Read()
  b.    Write()

让我们假设这些接口的实现在大多数情况下应保持相同。因此,如果我们必须从这些接口中实现一个抽象类,我们可以简单地创建一个类,比如抽象类EducatedAdult {}。 现在我们定义三个不同的类及其各自的继承和一组相应的属性;

1.  Carpenter.cs (derives from class A)
2.  Plumber.cs (derives from class B)
3.  Programmer.cs (derives from class C)

这里,A,B,C类是我无法编辑的一些外部库的一部分。现在,要使这些对象在本程序中可用,它们需要实现上面给出的接口。所以问题在于,对于这些类中的每一个,我都必须明确地实现上述接口。是否有更好的设计,我不必在所有类中冗余地实现接口。如果可能的话,这可能是一个解决方案;

班级EducatedAdult<t>: t, IAdult, IEducated { <implementation of interfaces> } 稍后,也许,我可以初始化我的派生类,如;

Carpenter carpenter = new EducatedAdult<Carpenter>()。并不是说这是一个理想的解决方案,因为木匠对象的公共接口仍然不包括我的接口成员(没有必要的转换)。但那么,最合适的设计是什么?

4 个答案:

答案 0 :(得分:1)

您无法真正为.NET中的接口提供默认实现,只能提供实现类来实现,但您可以使用接口上的扩展方法伪造它。

答案 1 :(得分:0)

好的,现在你更新了你的问题:

更新:工作量最少的方法可能是:

public interface IAdult { }
public interface IEducated { }

public static class Extensions
{
    // IAdult extensions
    public static void Age(this IAdult adult)
    {
        ...
    }

    public static void LicenseNo(this IAdult adult)
    {
        ...
    }

    // IEducated extensions
    public static void Read(this IEducated educated)
    {
        ...
    }

    public static void Write(this IEducated educated)
    {
        ...
    }
}

然后使用空接口标记您的类,以便您无需实现

public class Carpenter : IAdult, IEducated
{
}

你可以像这样使用它:

var carpenter = new Carpenter();
carpenter.Read();

如果你想“覆盖”接口方法以提供不同的实现,你可以这样做:

public class Carpenter : IAdult, IEducated
{
    public void Read() { ... }
}

当您在Read()对象上立即致电Carpenter时,它将使用Read()类中的实际Carpenter方法,而不是扩展方法。你甚至可以使它virtual并从Carpenter派生,并像以前一样在子类中覆盖它。要在Read()对象中调用Carpenter的默认实现,您必须Extensions.Read(this)而不是base.Read()

答案 2 :(得分:0)

在你的情况下,你应该创建EducatedAdult作为类实现EducatedAdult中三个类的所有常用方法实现为抽象其他类,然后在每个类上实现特定方法。

见到你

答案 3 :(得分:0)

不幸的是,如果没有某种程序集重写器或不使用dynamic,就无法在C#中执行此操作。您可以执行与mixin类似的操作,但这会改变您的设计。

如果您可以使用其他语言,OxygeneNemerle通过将其所有成员委派给也实现该接口的某个字段来提供实现接口的功能。