我有一个有趣的问题,我一直在徘徊,但似乎从未找到解决方法。
我倾向于成为一名防御性程序员,所以我尝试编写能够预防问题发生而非出现问题后再进行反应的代码。为此,我有以下情况。看下面的代码:
public class Base {}
public Interface IBase {}
public class Derived : Base, IBase {}
public class Derived2 : Base, IBase {}
...
public class DerivedN : Base, IBase {}
public class X : Base {}
public class Y : IBase {}
我需要将继承自Base并实现IBase的对象列表传递给集合,我需要确保只有同时具有这两个属性的对象才会被添加到列表中。此外,可能会有任意数量的类同时具有这两个属性,因此我不能使用派生类作为约束条件。
如果我将列表类型设为Base,则可以添加Y对象。如果将其设置为IBase类型,则可以添加X类型的对象(两者都不允许)。
当然,我可以创建自己的通用集合类,具有这两种类型,并对两种类型都设置约束。但是,我不想为所有可能的集合类型都这样做,即使只是将方法调用转发到包含的类中,也需要大量的工作。
我还可以创建一个BaseWithIBase类,它从Base和IBase派生,并将其用作我的集合类型,但如果不必要,我真的不想强制另一个抽象。
我不希望这是运行时检查,因此不能遍历树并抛出异常。
有人能提出更好的解决方案吗?
注意:Base和IBase没有关系,只是指它们是不同类型的基本项目。
编辑:
似乎每个人都想坚持“你不需要那样做”,并且这“不是面向对象编程”。这与事实相去甚远。我试图从问题中删除特定内容,以防止这些问题和评论,因此我将包括我的真实情况。
该代码是基于.NET Frameworks ServiceProcess.ServiceBase类实现的Windows服务框架。我在其上添加了自己的框架,旨在基于依赖注入,并且易于测试。
该集合必须包含从ServiceBase和IService派生的对象。IService是我在代码和测试中使用的框架扩展,基本上只是这样:
public interface IService
{
void Start();
void Stop();
}
此外,我还有许多其他接口:
public interface IRestartableService
{
void Restart();
}
public interface IConfigurableService
{
void Configure();
}
etc...等等,一个服务可能是这样的:
public class MyService : ServiceBase, IService, IConfigurableService {}
我的代码需要 IService,而 Windows 需要 ServiceBase,因此两者都是必需的,因为我使用 IService,而 Windows 使用 ServiceBase。我只需要 IService,其他接口是可选的。
Base
和IBase
的例子吗? - Andrey Shchekin