全局覆盖C#中的属性访问

时间:2015-02-24 12:14:30

标签: c# inheritance decorator

我有以下课程演示:

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

是否有通用的方法可以在不覆盖每个属性的情况下执行此操作?

谢谢!

5 个答案:

答案 0 :(得分:4)

你为什么要这样工作?

DetailedItem Item,如继承关系中所述,为什么保持 Item然后呢?覆盖其他属性?

您可以创建一个继承自 Item 并添加新属性的DetailedItem类。

答案 1 :(得分:1)

不,没有这样的方式。您必须授予对整个项目的访问权限,或者通过新属性公开它的内部属性。但似乎这种设计有问题。这种气味被称为"对象嫉妒"。

答案 2 :(得分: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
}

答案 3 :(得分: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,因为它已经在基类中定义了。

答案 4 :(得分: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"; }
        }
    }
  

请记住,这应该是一种罕见的情况,并不常见。