我有一个有趣的问题,我一直在盘旋,但我似乎从来没有安静地找到解决方案。
我倾向于成为一名防御性程序员,因此我尝试编写代码来防止问题发生,而不是在问题发生后立即做出反应。为此,我有以下情况。采取以下代码:
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 类型的对象(两者均不允许)。
当然,我可以创建自己的通用集合类,它具有两种类型并且对两者都有约束。但是,我不想对所有可能的集合类型都这样做,并且复制所有这些功能需要付出很多努力(即使您只是将方法调用转发到包含的类)。
我还可以创建一个从 Base 和 IBase 派生的 BaseWithIBase 类,并将其用作我的集合类型,但如果我不需要,我真的不想强制另一个抽象。
我不希望这是运行时检查,因此不接受遍历树并抛出异常。
任何人都可以提出更好的方法来解决这个问题吗?
注意:Base 和 IBase 没有关系,只是指出它们都是不同类型的基础项。
编辑:
似乎每个人都想坚持“你不需要这样做”并且它“不是 OOP”。没有东西会离事实很远。我试图从问题中删除特定内容以防止此类问题和评论,因此我将包括我的真实情况。
该代码是基于 .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();
}
等等..等等..服务可能看起来像这样:
public class MyService : ServiceBase, IService, IConfigurableService {}
我的代码需要 IService,Windows 需要 ServiceBase,因此两者都需要,因为我使用 IService,而 Windows 使用 ServiceBase。我只需要IService,其他接口是可选的。