2015-02-24 46 views
0

我有下面的类演示:在全球范围内覆盖属性访问

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属性返回内部项目属性。

有没有一种通用的方式来做到这一点,而不覆盖每个属性?

谢谢!

+0

是否想重写属性以使它们从派生类中只读? – 2015-02-24 12:16:20

+0

这看起来更像是一个架构问题,而不是像C#这样的问题。你想达到什么目的? – SBI 2015-02-24 12:17:15

+3

必须同意@SBI--这看起来似乎是一个奇怪的模式,派生类既继承自包含基类成员的类,也包含其成员。 – 2015-02-24 12:18:09

回答

1

不,没有这样的方式。您必须授予对整个项目的访问权限,或者通过新属性公开其内部属性。但似乎这样的设计有什么问题。这种气味被称为“物体羡慕”。

4

你为什么要这样工作?

DetailedItemItem,如继承关系描述,为何还持有Item再覆盖其他属性?

您可以创建一个DetailedItem类,该类继承自项目并且添加了新属性。

+0

谁downvoted这个正确答案,为什么? – 2015-02-24 12:28:25

1
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 
} 
+0

这是一个优于继承的组合示例,因为'DetailedItem'(最后)不会从'Item'继承_inherit_。 – heltonbiker 2015-02-24 12:34:46

+0

@heltonbiker exactly =)你也可以制作一个通用的界面,但对于这个演示,我认为它的矫枉过正 – 2015-02-24 12:36:06

0

它看起来就像你有一个继承类,像其他人所说。所以你的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,因为它是在基类中已定义。

0

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"; } 
     } 
    } 

请记住,这应该是一个罕见的场景,并不常见。