2014-09-03 184 views
0

在C#4.0中我有一個父類和子類,與此類似:屬性不可見

public abstract class Parent() 
{ 
    public Parent() { } 

    public void CommonMethod() { /* do something */ } 
} 

public class Child : Parent 
{ 
    public string PropertyA { get; set; } 
    public string PropertyA { get; set; } 

    public Child() : base() 

} 

如果我實例如下:

Parent obj = new Child(); 

..我不能可以訪問PropertyAPropertyB。我意識到objParent類型,它沒有這些成員,但我怎樣才能以「乾淨」的方式訪問它們?我能做到以下幾點:

Child obj = new Child(); 

..這會給我的訪問,但我經常看到的物體正在取得被輸入到父,而不是孩子。爲什麼這很常見?我是否以這種錯誤的方式去做?

編輯:我應該說,Child()中的屬性不是所有派生自Parent()的類都通用的。那些在你的父類有產者的

回答

1

如果這些特性是所有派生類型常見,那麼你應該在基類中聲明它們。

如果他們是一些派生類型,然後把它們放入interface並從您的派生類實現該接口。

如果它們只針對Child類,那麼您沒有太多選擇,要麼將您的實例聲明爲Child而不是Parent,或者檢查類型並進行適當的轉換。

+0

他們不常見;我應該說明這一點。問題已更新。 – 2014-09-03 11:06:43

0

補充聲明,如下圖所示: -

public abstract class Parent() 
{ 
    public Parent() { } 
    public string PropertyA { get; set; } 
    public string PropertyA { get; set; } 
} 

更新: -

我建議所有的抽象類代碼傳送到一個接口並有聲明的屬性並在任何需要的地方使用兒童界面,並按照其他人在此提出的建議,如果主要重點放在兒童上,則請製作child的實例,而不是parent

接口將如下: -

public interface IParent 
{ 
    // interface members 
     string PropertyA { get; set; } 
     string PropertyA { get; set; } 
} 
+0

的問題是,PropertyA&PropertyB不常見於母公司所有的孩子。 – 2014-09-03 11:07:12

+0

你的意思是一些孩子有那些合適的人,有些人不正確? @ John'Mark'Smith – Neel 2014-09-03 11:08:03

1

我經常看到製作的對象是父類而不是子類型。爲什麼這很常見?

如果你不需要它,請不要使用它。顯然你的Child屬性是重要的;然後宣佈您的objChild,而不是Parent

反過來,如果您只關心Parent成員,則可以使用Parent聲明。

我怎樣才能以'乾淨'的方式訪問他們?

鑄造:

Parent obj = new Child(); 
((Child)obj).PropertyA = "foo"; 

但並不是每一個Parent必須是一個Child

0

你需要改變調用你的方法如下
父obj = new Child(); - >是你

需要是這樣的`

Parent obj=new Parent(); or Child obj=new Child(); 

,並在你的父類改變類是這樣的:

public string PropertyA { get; set; } 


public string PropertyB { get; set; } 

在你的基類需要有同樣的方法。

並派生你的類需要像父類一樣這是第二種方法。

0

您從Parent中定義了一個對象,但是它從Child中定義了一個對象,但它是new。因此,無論何時調用obj的任何方法或屬性,程序都會參考Parent類來查找它們,但由於您沒有覆蓋它們,因此無法在Parent中找到這些屬性。

public abstract class Parent() 
{ 
    public Parent() { } 

    public void CommonMethod() { /* do something */ } 

    abstract public PropertyA {get; set;} 
    abstract public PropertyB {get; set;} 
} 

public class Child : Parent 
{ 
    override public string PropertyA { get; set; } 
    override public string PropertyA { get; set; } 

    public Child() : base() 

}