2015-02-24 80 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"; } 
     } 
    } 

請記住,這應該是一個罕見的場景,並不常見。