2013-08-02 60 views
-1
I came across a lot of code in our company codebase with the following structure 



    class Base 
    { 
    public Base (var a, var b) 
    { 
     base_a = a; 
     base_b = b; 
    } 

    var base_a; 
    var base_b; 
    } 

    class Derived:Base 
    { 
    publc Derived (var a,b,c,d): base (a,d) 
    { 
     der_c = c; 
     der_d = d; 
    } 
    var der_c; 
    var der_d; 
    var der_e; 
    } 


    class Ref 
    { 
    Base _ref; 
    public Ref(var a,b,c,d) 
    { 
     _ref = new Derived (a,b,c,d) 
    } 

    public void method() 
    { 
     _ref.der_e = 444; // won't compile 
    } 
    } 

什麼是初始化der_e的正確方法?引用基類併爲_ref使用對象派生類有什麼好處?只是使用基類引用可以容納多個派生類對象的事實?如果是這樣的話,派生類的所有成員變量都應該在構造過程中初始化(像這樣:_ref = new Derived(a,b,c,d))。如果我想稍後在方法中初始化_ref.der_e怎麼辦?我知道我可以做到這一點(var cast_ref = _ref爲Derived; cast_ref.der_e = 444),但這種看起來並不是最佳做法。擁有這樣一個結構的想法是什麼,以及在派生類對象構建之後初始化其成員的正確性是什麼?使用基類引用對象初始化派生類成員變量

+0

你給不會在所有的編譯代碼 - 你不能使用'var'參數或字段(除非實際上有一個名爲'var'的類)。請給出一個*逼真的例子 - 理想情況下更短,遵循.NET命名約定,並且格式更好。 –

回答

0

在單個帖子中,這些問題太多。

什麼是初始化der_e的正確方法?

爲了初始化der_e你必須有Derived類的參考,因爲它知道的der_e財產,而不是Base類。

引用基類並使用 對象派生類用於_ref有什麼好處?

是的,這就是所謂的Polymorphism這是面向對象編程的本質。它允許我們在不知道實際實現的情況下持有各種具體實現。

如果是這樣的情況下,應得出 類的所有成員變量被構造本身期間初始化(這樣的:_ref =新 衍生(A,B,C,d))

沒有這樣的規則。這取決於你的情況。如果在創建對象之後這些值不會被改變,並且在施工對象之前已經知道這些值,那麼它們應該在施工期間被初始化。

同樣,如果有各種情況下,像有時值已知,有時不知道,那麼可以有重載構造函數,它們採取不同的參數。

如果我想稍後在方法中初始化_ref.der_e會怎樣?

這非常好,它取決於你想達到的目標。這個問題不是一個具體的問題,而是一個抽象的問題,在這個問題上很難評論你想達到的目標。

我知道我能做到這一點(VAR cast_ref = _ref作爲派生; cast_ref.der_e = 444),但是這看起來似乎並沒有最好的做法一樣。

我分享一些Java代碼,因爲我從Java背景

//This class knows about Base and nothing about the Derived class 
class UserOfBase{ 

    Base ref; 

    //Constructor of UserOfBase gets passed an instance of Base 
    public UserOfBase(Base bInstance){ 
     this.ref = bInstance; 
    } 

    //Now this class should not cast it into Derived class as that would not be a polymorphic behavior. In that case you have got your design wrong. 

    public void someMethod(){ 
     Derived derivedRef = (Derived)ref; //This should not happen here 
    } 

} 

我分享一些參考這將幫助你這個是它類似於C#,因爲我想答案可以很長期解釋。

+0

public void someMethod(){ Derived derivedRef =(Derived)ref; //這不應該發生在這裏 } 您是否說這是在構造函數中相同 public UserOfBase(int a){ this.ref = new Derive(a); } – cyrux

+0

@cyrux yes這與'UserOfBase'不應該實例化具體的派生類實例是一樣的。它只需要知道基地,而不是其他任何東西。請參閱依賴注入 - 即將依賴注入到UserOfBase中。 –

相關問題