我有Bills和Receipts。这两种类型都有一个名为Lines的属性,但是Receipt.Lines充满了ReceiptLines,而Bill.Lines充满了BillLines。我希望它们都继承自一个名为Document的类,该类具有一个充满<ReceiptLine>D9BillLine>s的属性Lines,这样我就可以偶尔将它们传递给在Documents上操作的函数,但我不希望每次专门使用Bill或Receipt时都必须使用myReceipt.Lines.Select(line => (ReceiptLine)line)。有没有一种优雅的方法来做到这一点呢?
请注意,以下尝试将导致CS1503 Argument 1: cannot convert from 'Receipt' to 'Document<DocumentLine>'
void Main()
{
var something = new Receipt();
DoStuff(something);
}
public void DoStuff(Document<DocumentLine> document) { }
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> { }发布于 2019-06-11 00:49:36
请注意,在重写时不能更改类型,但可以使线型成为泛型参数。
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的实际类型。这样更安全,因为它不允许您指定不适当的类型,并且允许您从Document<TDocLine>类中的其他方法访问在DocumentLine中声明的公共成员。
https://stackoverflow.com/questions/56530288
复制相似问题