使用基类列表创建基类

时间:2019-06-10 16:38:39

标签: c#

我有BillReceipt个。两种类型都有一个名为Lines的属性,但是Receipt.Lines充满了ReceiptLine,而Bill.Lines充满了BillLine。我希望它们都从具有属性Document的{​​{1}}类继承,该属性充满Lines,以便偶尔将它们传递给在{{1}上操作的函数},但是我不想每次都专门使用DocumentLineDocument时都必须myReceipt.Lines.Select(line => (ReceiptLine)line)。有没有一种优雅的方法可以做到这一点?

请注意,以下尝试会导致Bill

Receipt

2 个答案:

答案 0 :(得分:2)

您可以使用通用类型来定义列表项类型,如下所示:

interface DocumentLine { }
class BillLine : DocumentLine { }
class ReceiptLine : DocumentLine { }

class Document<T> where T : DocumentLine
{
    public List<T> Lines { get; set; }
}

class Bill : Document<BillLine> { }

class Receipt : Document<ReceiptLine>   { }

答案 1 :(得分:2)

请注意,您无法在覆盖时更改类型,但可以使线型成为通用参数。

public abstract class DocumentLine { ... }
public class BillLine : DocumentLine { ... }
public class ReceiptLine : DocumentLine { ... }

public abstract class Document<TDocLine> where TDocLine : DocumentLine
{
    public List<TDocLine> Lines { get; set; }
}

public class Bill : Document<BillLine> { ... }
public class Receipt : Document<ReceiptLine> { ... }

从公共基础派生线型具有优势。 1)您可以重复使用两种线型共有的东西。 2)您可以限制TDocLine的实际类型。这样比较安全,因为它不允许您指定不合适的类型,并且允许您从DocumentLine类中的其他方法访问Document<TDocLine>中声明的公共成员。