类库中的可选接口

时间:2010-09-16 22:49:01

标签: c# design-patterns interface

我有一个名为IProjectUser的接口,它定义了一个读取函数和一个用于读取和写入项目文件的写入函数。我还有一个名为Project的类,它包含一个IProjectUser对象的通用列表来管理项目文件。这两个都在类库Project.dll中。

我还有一个名为A.dll的类库,它包含一个名为Foo的类,它实现了IProjectUser。读取/写入项目文件的能力是此类的次要能力。它保存并操纵一些数据。 A.dll引用Project.dll。

该应用程序还包含一些实现IProjectUser的表单和其他类。

我可以想象将来我可能想要在另一个不使用项目文件的项目中使用A.dll的情况。但是我会被迫包含Project.dll,因为A.dll需要它。即使功能是可选的。

是否有不同的设计模式可以让我基本上选择一个接口?

我希望我能够清楚地解释这一点。

更新

如何将对象转换为接口?这将打开接口未正确实现的可能性。对于这类问题,这是一种好的还是坏的设计方法?

if (Foo is IProjectUser) {
  ProjectUsers.Add(Foo as IProjectUser);
  // etc
}

2 个答案:

答案 0 :(得分:2)

使用继承或多个接口。你不能使接口方法可选。

答案 1 :(得分:1)

将对象强制转换为未实现的接口将无效 - 您最终会在变量中使用null值。如下所示,使用正确的设计并添加B.dll有什么问题? A.dll变得完全可重用,你仍然可以使用一个实现IProjectUser的Foo版本。

  1. 从A.dll中删除对Project.dll的引用。
  2. 从Foo中删除IProjectUser。
  3. 创建引用Project.dll和A.dll的B.dll。
  4. 在B.dll中创建FooProjectUser,它继承自Foo并实现IProjectUser。
  5. 将项目特定逻辑从Foo移动到FooProjectUser。
  6. 在您当前使用Foo的地方使用FooProjectUser,从任何对Project.dll的引用中释放A.dll。