Fra*_*lin 1 c# inheritance casting
考虑:
class Order
{
public List<OrderItem> OrderItems {get;set;}
}
class SalesOrder : Order
{
public List<SalesOrderItem> OrderItems {get;set;}
}
class OrderItem {}
class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)
当试图施放
SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems = List<SalesOrderItem>();
salesorder.OrderItems.Add(new SalesOrderItem());
Order order = salesorder;
Run Code Online (Sandbox Code Playgroud)
order.Orderitems
一片空白.有没有办法让这个演员用于派生属性?
我尝试过与界面协方差,但后来不能使用List
和使用IEnumerable
将不允许公共设置器.有关如何实现这一点的任何想法?
这就是所谓的" 阴影 ".
你salesOrder
有两个OrderItems
属性 - 一个只对SalesOrder
s 可见,一个只对Order
s 可见.OrderItems
子类中的属性将隐藏在父类中的属性.您正在向一个项目添加项目,然后观察另一个项目.
我认为您需要重新考虑您的设计,但是您可以通过从子类中删除属性来解决此问题:
class Order
{
public Order()
{
OrderItems = new List<OrderItem>();
}
public List<OrderItem> OrderItems {get;set;}
}
class SalesOrder : Order { }
class OrderItem {}
class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)
另一个选择是创建Order
一个泛型类:
class Order<T> where T: OrderItem
{
public Order()
{
OrderItems = new List<T>();
}
public List<T> OrderItems {get;set;}
}
class SalesOrder : Order<SalesOrderItem> { }
class OrderItem {}
class SalesOrderItem : OrderItem {}
Run Code Online (Sandbox Code Playgroud)
SalesOrder salesorder = new SalesOrder();
salesorder.OrderItems.Add(new SalesOrderItem());
Order<SalesOrderItem> order = salesorder;
Run Code Online (Sandbox Code Playgroud)
第二种方法的好处是它允许OrderItems
存储特定类型的订单商品而不是最通用的类型.
归档时间: |
|
查看次数: |
85 次 |
最近记录: |