【发布时间】:2015-02-27 17:17:51
【问题描述】:
我有一个类库,用于描述连接硬件的不同部分,例如钉子、螺钉和螺栓,我们将其称为 ConnectorLibrary。我正在尝试在该库之上构建一个库,用于分析该库中每个类的抓握能力,我们将其称为 ConnectorGripAnalysisLibrary。
对于这个问题,我们将使用以下类:Screw、Bolt 和 Connector。 Screw 和 Bolt 都继承自 Connector(这是一个抽象类),它们都在 ConnectorLibrary 中实现。
对于我需要实现的基础库中的每个类,有一种不同的方法来确定抓地力。所以对于Bolt 和Screw,我需要实现一个方法,比如DoesPassGripTest(Board board)。 (Board 只是一个示例参数)
如果我要在连接器库中实现它,我会将DoesPassGripTest 放入一个抽象方法Connector 中,并在各自的派生类中实现不同的公式。
目标是能够让我的代码在 ConnectorGripAnalysisLibrary 中像这样工作:
[Test()]
public static void CheckScrewAndBoltGripTest()
{
Board board = new Board();
Bolt b = new Bolt();
Screw s = new Screw();
List<Connector> connectors = new List<Connector>()
connectors.add(b);
connectors.add(s);
foreach(var connector in connectors)
{
if(!connector.DoesPassGripTest(board));
throw new Exception("Grip Test Fails");
}
}
我想在 ConnectorGripAnalysisLibrary 中保持“开闭原则”,以便在将新的 Connector 添加到 ConnectorLibary 的情况下,除了添加新类之外不需要修改 ConnectorGripAnalysisLibrary。 "开放扩展,关闭修改"
但是我如何才能将此功能构建到构建在 ConnectorLibrary 之上的 GripAnalysisLibrary 中。有没有一种巧妙的方法可以做到这一点?
我不希望 ConnectorLibrary 包含 GripAnalysis 代码和功能。 ConnectorLibrary 将是开源的,而 GripAnalysisLibrary 将是专有的。
【问题讨论】:
-
接口怎么样,所以每个类型都实现
DoesPassGripTest做任何它需要的事情? -
@Plutonix 如何在不派生新类型的情况下通过扩展实现接口?
-
为什么它需要成为一个扩展?
-
因为我不希望 ConnectorLibrary 包含 GripAnalysis 代码和功能。 ConnectorLibrary 将是开源的,而 ConnectorGripAnalysisLibrary 将是专有的
-
您将无法向
Connector添加虚拟/抽象方法。我认为您所希望的最好的结果是某种从Connector类型到ConnectorTester类型的映射,它实现了测试逻辑。如果需要,您可以将所有内容包装在扩展方法中。
标签: c# inheritance polymorphism extension-methods solid-principles