2013-08-25 53 views
0

這可能很簡單,但我是C#上的新手。有些類:僅當父類具體時纔可用的屬性

public class Extension { 
     Public string Name; 
     Public List<View> Views; 
} 

public class Module : Extension { 
    // ... 
} 

public class Component : Extension { 
    // ... 
} 

public class View { 
    // ... 
} 

和收集:

List<Extensions> MyExtensions = new List<Extensions>() { 
    new Component { 
     Name = "Component", 
     Views = new List<View>() { 

     } 
    } 
    new Module { 
     Name = "Module", 
     Views = new List<View>() { 

     } 
    } 
} 

如何查看可用的不僅是他的父母是一個組件添加屬性FOO?

+1

父類在兩種情況下是'Extension'。你的意思是***子類是否是'Component'? –

+2

只有當他的父母是一個組件時,你有什麼作爲?什麼家長?目前你還不清楚你在問什麼。 –

+0

'Extension'有一個'List '。我想OP要'View'來暴露一個屬性'Foo',只要它在'Component'列表中而不是'Module'中。這怎麼會有意義,我甚至不明白。 – Corak

回答

1

由於您的課程現在正在設置,您將無法獲得該結果而無需訴諸一些超級黑客代碼。相反,我認爲你應該改變你的類此:

public abstract class View 
{ 
    // ... 
} 

public class ModuleView : View 
{ 

} 

public class ComponentView : View 
{ 
    public object Foo; //Substitute object with whatever type Foo is 
} 

public abstract class Extension 
{ 
    public string Name; 
    public abstract List<View> Views { get; set; } 
} 

public class Module : Extension 
{ 
    public override List<View> Views 
    { 
     get 
     { 
      ModuleView moduleViewA = new ModuleView(); 
      ModuleView moduleViewB = new ModuleView(); 
      //Continue building whatever ModuleView objects you need... 

      return new List<View>() 
      { 
       moduleViewA, 
       moduleViewB, 
       //...plus all other ModuleView objects you built 
      }; 
     } 
     set 
     { 
      Views = value; 
     } 
    } 
} 

public class Component : Extension 
{ 
    public override List<View> Views 
    { 
     get 
     { 
      ComponentView compViewA = new ComponentView(); 
      ComponentView compViewB = new ComponentView(); 
      //Continue building whatever ComponentView objects you need... 

      return new List<View>() 
      { 
       compViewA, 
       compViewB, 
       //...plus all other ComponentView objects you built 
      }; 
     } 
     set 
     { 
      Views = value; 
     } 
    } 
} 

這保證了只有Component對象將永遠能夠看到現場Foo

+0

這段代碼不會被編譯,因爲1)你不能有抽象字段,因爲它們不能被覆蓋,2)當覆蓋它時你不能改變'Views'屬性的類型。 –

+0

@D Stanley:你說的確是有編譯錯誤;我忘了在VS中打Build。但是,只要在非抽象後代使用'override'關鍵字,就可以在C#中使用'abstract'字段。我編輯了我的代碼示例,以便它現在可以正確構建。 –

0

您請求的目的是非常模糊的,但一個選項,你可以有 - 如果Component是在同一程序定義爲View - 是使財產internal。這使該屬性僅對同一個程序集中的類型可見。

當然,這意味着Module(以及其他任何想要「隱藏」Foo的類型)需要在不同的程序集中定義,否則它也可以訪問該屬性。

Assembly1.dll

public class Extension { 
     Public string Name {get; set;} 
     Public List<View> Views {get; set;} 
} 

public class Component : Extension { 
    // View.Foo is accessible here; 
} 

public class View { 
    internal object Foo {get; set;} 
} 

Assembly2.dll

public class Module : Extension { 
    // View.Foo is not visible here 
} 
相關問題