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属性 - 一个只对SalesOrders 可见,一个只对Orders 可见.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 次 |
| 最近记录: |