2017-08-15 58 views
-5

這就是:調用子實例從抽象父類中實現的功能在C#

abstract class IA 
{ 
    public virtual void ChangePropertyOfAIChild() 
    { 
    b.value = true; 
    } 
} 
... 
class B:IA 
{ 
    bool value; 

} 

class C:IA 
{ 
    bool value; 
} 
.... 
///main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance .ChangePropertyOfAIChild(); 

///// 

什麼是從抽象基類calliing在孩子的班級已經implememnted功能和改變有道它的價值? 謝謝!

+1

如果B是A的孩子,A怎麼會知道(或者甚至在意)B存在?你的等級倒退 –

+0

我在這裏錯過了什麼嗎?這段代碼甚至沒有編譯。你將如何訪問一個甚至不存在的東西的屬性? – Sach

回答

1

正如@Camilo Terevinto指出的那樣,你的病態是錯誤的。嘗試:

public abstract class IA 
{ 
    public bool value; 

    public virtual void ChangePropertyOfAIChild() 
    { 
    value = true; 
    } 
} 

public class B : IA 
{ } 

public class C : IA 
{ } 

// in main 
IA newBInstance = new B(); 
newBInstance.ChangePropertyOfAIChild(); 

IA newCInstance = new C(); 
newCInstance.ChangePropertyOfAIChild(); 
/// 

你的示例代碼具有抽象基類試圖改變一個字段的值的一類,它不知道有關:

(b.value =真)

對於基類能夠做到這一點,該字段需要在基類內聲明。

+0

你是對的。謝謝! –

1

我相信你沒有得到你的繼承權。

如果這是你的類實現:

public abstract class IA 
{ 
} 

public class B : IA 
{ 
    public bool value; 
} 

public class C : IA 
{ 
    public bool value; 
} 

,然後如果你創建的IA一個實例,像這樣:

IA newBInstance = new B(); 

然後編譯前進並創造了IA一個實例。由於您的IA沒有名爲value的屬性,因此您無法訪問它。

你有兩個選擇,要麼使用由CodexNZ建議的方法在前面的回覆,或者乾脆投你newInstanceB和直接設置value。就像這樣:

IA newBInstance = new B(); 
((B)newBInstance).value = true; 

然而,這是反直覺的,因爲如果你能做到,你不妨首先創建的B一個實例。所以我推薦以前的方法。這是更多的解釋爲什麼你的邏輯不起作用。

要了解更多信息,請參閱教程like this。互聯網上有更多的資源。