c# - 具有泛型列表的类继承设计

标签 c#

我目前正在为涉及泛型列表的类设计而苦苦挣扎:

代码超过千字:

class Document
{
    public List<Result> Results { get; } = new List<Result>();
}

class Result
{
}

class SpecialDocument : Document
{
    public new List<SpecialResult> Results { get; } = new List<SpecialResult>();
}

class SpecialResult : Result
{
}

我不喜欢当前设计的是 SpecialDocument.Results隐藏 Document.Results .如果一个人有 DocumentSpecialDocument 上查看, 根本没有结果,即使有可能是 Result查看全部SpecialResult元素。

我想完成的是:

SpecialDocument doc = new SpecialDocument();
doc.Results.Add(new SpecialResult());
Assert.AreEqual(1, (doc as Document).Results.Count); // Here my design obviously fails right now

...我想在不失去类型安全的情况下实现这一点(因为这实际上是 List<T> 不是协变的原因)。

编辑

我忘了说 SpecialDocumentDocument实际上需要有相同的后继者(或实现相同的接口(interface)),这样它们才能在一个集合中共存:

List<Document> documents = new List<Document>()
{
    new Document(),
    new SpecialDocument()
};

最佳答案

你试过泛型吗?

abstract class Document<T> where T : Result
{
    public List<T> Results { get; } = new List<T>();
}

abstract class Result
{
}

class SpecialDocument : Document<SpecialResult>
{
}

class SpecialResult : Result
{
}

SpecialDocument会自动实例化List<SpecialResult> .

关于c# - 具有泛型列表的类继承设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50220628/

相关文章:

c# - 如何在 Xamarin.Forms 中实现轮播的事件指示器?

c# - 创建一个没有提升的进程

c# - 如何修复 'file is in use by another process' 错误

c# - 使用正则表达式从 ListDirectoryDe​​tails 中解析文件名

c# - 将字符串整数转换为 int 的任何比 convert.toint32 更有效的方法

c# - *.Designer.cs 文件丢失

c# - 从 .NET Framework 传统项目中引用 .NET Standard csproj 项目

c# - 使用 Python 访问 C# 库中的方法 - Interop .dll 文件

c# - 如何使用 MonoTouch 获取 iPhone/iPad 的宽度和高度?

c# - 默认情况下,LINQ 和 Entity Framework 加载的渴望程度如何?