我有一个设计问题。 我将提出一个假设的情况。 我的应用程序需要几个接口才能使对象可用。让我们说它们是;
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>()
。并不是说这是一个理想的解决方案,因为木匠对象的公共接口仍然不包括我的接口成员(没有必要的转换)。但那么,最合适的设计是什么?
答案 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)