在全球范围内覆盖属性访问
我有下面的类演示:在全球范围内覆盖属性访问
public class Item
{
public string Id {get;set;}
public string Name {get;set;}
}
public class DetailedItem : Item
{
public Item item {get;set;}
public override string Id{
get{return this.item.Id}
}
}
就像我的ID属性中显示,我想,当我访问从DetailedItem属性返回内部项目属性。
有没有一种通用的方式来做到这一点,而不覆盖每个属性?
谢谢!
不,没有这样的方式。您必须授予对整个项目的访问权限,或者通过新属性公开其内部属性。但似乎这样的设计有什么问题。这种气味被称为“物体羡慕”。
你为什么要这样工作?
DetailedItem
是的Item
,如继承关系描述,为何还持有的Item
再覆盖其他属性?
您可以创建一个DetailedItem
类,该类继承自项目并且添加了新属性。
谁downvoted这个正确答案,为什么? – 2015-02-24 12:28:25
public class Item
{
public string ID {get;set;}
public string Name {get;set;}
}
确定到目前为止...
public class DetailedItem //as an adapter or proxy object
{
private Item item;
public string ID { get { return item.ID; }}
public string Name { get { return item.Name;}}
public DetailedItem(Item item) { this.item = item; } //constructor
}
这是一个优于继承的组合示例,因为'DetailedItem'(最后)不会从'Item'继承_inherit_。 – heltonbiker 2015-02-24 12:34:46
@heltonbiker exactly =)你也可以制作一个通用的界面,但对于这个演示,我认为它的矫枉过正 – 2015-02-24 12:36:06
它看起来就像你有一个继承类,像其他人所说。所以你的DetailedItem
“是一个”而不是“有(n)”Item
。
所以你甚至不需要重复派生类中基类的属性。你可以这样做:
public class Item
{
public string Id {get;set;}
public string Name {get;set;}
}
public class DetailedItem : Item
{
public String Details { get; set; } // just an example other property
}
然后你就可以直接拨打电话DetailedItem.Id
,因为它是在基类中已定义。
Roy Dictus是正确的。但是,如果你遇到,你不能修改结构的任何情况,并想完全地隐藏基本实现然后用new
关键字
public class Item
{
public string Id { get; set; }
public string Name { get; set; }
}
public class DetailedItem : Item
{
public new string Id
{
get { return "newid"; }
}
}
请记住,这应该是一个罕见的场景,并不常见。
是否想重写属性以使它们从派生类中只读? – 2015-02-24 12:16:20
这看起来更像是一个架构问题,而不是像C#这样的问题。你想达到什么目的? – SBI 2015-02-24 12:17:15
必须同意@SBI--这看起来似乎是一个奇怪的模式,派生类既继承自包含基类成员的类,也包含其成员。 – 2015-02-24 12:18:09