我正在设计一个用户可以扩展的框架。 基本上我会为他们提供一组他们可以实现的接口,而我的“manager”类会调用他们的实现:
abstract1 = factory.GetConcreteExtension1()
abstract2 = factory.GetConcreteExtension2()
abstract1.DoSomething(abstract2)
我的客户端实现抽象的具体版本。 但是,他们可能决定将数据添加到不在abstract2接口中的concrete2。 这将迫使他们在concrete.DoSomething实现中将abstract2向下转换为concrete2。
这看起来像代码味道,因为我强迫它们实现一个方法(DoSomething),它在签名中需要abstract1但实际上只能得到concrete1(加上我强迫它们编写转换)。
我找不到既能保持合同定义的解决方案又能让我的框架自己管理流程。有什么想法吗?
答案 0 :(得分:2)
所以用参数abstract2调用abstract1的DoSomething,你想从DoSomething方法获取abstract2的数据吗?
在这种情况下,在我看来,最好给出abstract2行为,以便abstract1通过abstract2的行为而不是通过其数据与之交互。
答案 1 :(得分:1)
这取决于您使用的语言,但在C#中,您可以使用带有约束的模板来为您提供类型安全,同时仍然强制该类必须从您的抽象基类派生。