【发布时间】:2014-11-21 08:28:14
【问题描述】:
我很难描述标题中的问题,如果标题不是最清楚的,请见谅。
假设我有以下接口/类:
public interface IAction { /*...*/ }
public class WriteAction : IAction { /*...*/ }
public class ReadAction : IAction { /*...*/ }
现在,这些操作将用于其他类。 ReadWriteTest 可以同时拥有 ReadAction 和 WriteAction 对象,但 ReadTest 只能拥有 ReadAction 对象。
请注意,这些测试对象不仅仅如此,我正在编辑其他功能,因为它们与问题无关。
两个xxxTest 类共享一个公共接口。所以接口和ReadWriteTest类的实现如下:
public interface ITest
{
List<IAction> Actions { get; set; }
}
public class ReadWriteTest : ITest
{
public List<IAction> Actions { get; set; }
}
问题是对于ReadTest 类,我想将此属性限制为仅包含ReadAction 元素。
我尝试实现的内容如下:
public class ReadTest : ITest
{
public List<ReadAction> Actions { get; set; }
}
在我看来这应该可行,因为每个 ReadAction 都固有地实现了 IAction 接口。
但是,编译器不喜欢它,并告诉我 ReadTest 类没有实现所有需要的 IAction 属性。
有没有办法在 ReadTest 类定义中限制这个 Actionlist 的内容?
我可以通过创建一个自定义的 AddAction(IAction action) 方法来解决这个问题,该方法根本不添加任何 WriteAction 对象,但我希望有一个更优雅的解决方案来解决这个问题。
这可能吗?
最终结果更新
正如回答的那样,可以通过向接口添加泛型类型来完成。这解决了我所描述的问题,但遗憾的是并没有解决更大的问题。添加这个泛型类型意味着我现在不能将任一 Test 对象作为 ITest 来寻址,因为我现在需要指定泛型参数,这对于任一 Test 都不同。
解决方案(或至少 my 解决方案)是从ITest 接口中删除Actions 属性。 Actions 属性仍然存在于类中。
我没有在接口中定义 list 属性,而是在接口中添加了一个Run() 方法。此方法将遍历任一 Test 类中本地定义的 Actions 列表。
所以作为一个快速概述:
foreach(ITest myTest in myTests)
{
myTest.Run()
}
ReadWriteTest 的类实现:
public List<IAction> Actions {get; set;}
public void Run()
{
foreach(IAction action in Actions) { /*...*/ }
}
ReadTest 的类实现:
public List<ReadAction> Actions {get; set;}
public void Run()
{
foreach(IAction action in Actions) //I could also declare it as a ReadAction. Either works.
{ /*...*/ }
}
【问题讨论】: