2011-10-07 92 views
2

我有了一個子類的基類(可能是一個結構我想但不知道這是否是合適的)和方法。在基類中訪問子......但不同

class Base 
{ 
    protected class SubClass 
    { 
     public string word; 
     public int number; 
    } 

    protected void SomeMethod() 
    { 
     this.SubClass.word //this is where I'm struggling 
    } 
} 

然後,我有我的執行基類幾個子類,實例化Base.SubClass有的值添加到實例化的類。

class ChildClass1 : Base 
{ 
    public childSubClass = new SubClass(); 

    public void DoSomethingRidiculous() 
    { 
     childSubClass.word = "WhoFarted"; 
    } 
} 

class ChildClass2 : Base 
{ 
    public childSubClass = new SubClass(); 

    public void DoSomethingRidiculous() 
    { 
     childSubClass.word = "ItStinks"; 
    } 
} 

如果可能,我希望能夠從Base類中獲取SubClass.word的值。我認爲我實施我的想法的嘗試可能是錯誤的。

+1

能描述一下你的總體目標是什麼?這是一個相當古怪的階級結構。 –

+1

你的術語相當混亂。你稱之爲一個子類叫做嵌套類。你稱之爲子類的是一個子類。 – Oded

+0

@Oded謝謝你清理那個......你可能知道我還在學習。 – bflemi3

回答

3

我不知道你真正需要的子類/類嵌套。剛搬出類​​聲明,聲明​​類型的保護地/屬性。

public class SubClass 
{ 
    public string word; 
    public int number; 
} 

public class Base 
{ 
    protected SubClass subClassInstance = new SubClass(); 

    protected void SomeMethod() 
    { 
     this.subClassInstance.word //this is where I'm struggling 
    } 
} 

然後你就可以訪問subClassInstanceChildClass1ChildClass2

+0

我肯定是做錯了。這是清楚而簡潔的。我認爲這很明顯,我還在學習,所以謝謝你的理解。非常感激! – bflemi3

+0

注意(對於OP),在這種情況下,您仍然可以在'Base'內嵌套'SubClass'。您只需在派生類中訪問基類的「subClassInstance」,而不是在其中顯式實例化它。 –

1

基類沒有字段或​​類型的屬性,所以你絕對不能做,你直接提出什麼。

一個解決辦法是

public childSubClass = new SubClass(); 

添加字段到Base本身的類。這有問題嗎?

其他的解決辦法是使用反射來獲取字段的值,假設你是反映物體確實有這樣的領域。這實在是太牽強了,雖然它可能在技術上允許你做你的建議,但它有一個非常糟糕的代碼味道。

1

內部的基類不能(或應該沒有)派生類的訪問權限的成員,平時也不知道約派生類(一些例外適用,例如在州模式的情況下)。如果基地應該有權訪問成員,則應在基地申報。如果派生類還應該能夠使用該成員,則將該成員標記爲受保護的。

class Base 
{ 
    protected Foo someFoo; 

    void Frob() 
    { 
     // can access methods/properties of someFoo instance 
    } 
} 

class Child 
{ 
    public Child() 
    { 
     someFoo = new Foo(); // child can also access someFoo 
    } 
} 
1

我不知道爲什麼你正在做一個子類,而不是僅僅使基類的這兩個屬性的,但你有這個線故障的原因:

this.SubClass.word //this is where I'm struggling 

是因爲你沒有將SubClass實例化爲基類的一個屬性。