2017-09-02 100 views
0

訪問我想創建一個類下面的例子:如何使外部對象的字段中derivered類

class BaseClass 
{ 
    protected int a; 
} 

class DeriveredClass : BaseClass 
{ 
    protected int ownA; 

    public void CopyFrom(BaseClass b) 
    { 
     ownA = b.a; 
    } 
} 

但它似乎是不可能的,因爲保護級別。問題是「b」是CopyFrom()方法內的外部對象。

確切的代碼我想使用它的是創建一個Singleton對象與它升級到派生類型的對象的可能性:

class MyLogicBase 
{ 
    private static MyLogicBase s_Instance = new MyLogicBase(); 

    protected MyLogicBase() { } 

    public static MyLogicBase Instance 
    { get { return s_Instance; } } 

    public static Upgrade(MyLogicBase newInstance) 
    { 
     newInstance.UpgradeInstance(s_Instance); 
     s_Instance = newInstance; 
    } 

    protected virtual void UpgradeInstance(MyLogicBase previousInstance) 
    { // To override } 

    protected List<string> m_Database = new List<string>(); 
} 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     m_Database = newInstance.m_Database; 
    } 

    // Extended logic here 
} 

回答

2

只是委託能力的基類。您甚至可以在該類中聲明虛擬方法UpgradeInstance

class MyLogicBase 
{ 
    … 

    public virtual void UpgradeInstance(MyLogicBase newInstance) 
    { 
     m_Database = from.m_Database; 
    } 

    protected List<string> m_Database = new List<string>(); 
} 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     base.UpgradeInstance(newInstance); 
     … 
    } 

    …  
} 
+0

您好!感謝您的快速回復。意外的是,我寫了一個代碼示例,它不顯示我想解決的問題。我很抱歉我的錯誤。更正它。問題是我希望派生類使用基類對象進行自身設置,而基類對象的文件仍然保留爲其他類。 –

+0

@KamilKowalewski解決方案仍然是一樣的。 'UpgradeInstance'虛擬方法是複製'm_Database'字段的正確位置。如果出於任何原因,您不希望在基類「UpgradeInstance」中出現像這樣的共同行爲,請爲此目的另外聲明一個方法。 –

+0

這使它比我更復雜一點,儘管它可能是。不同的派生類可以以不同的方式使用不同的基類字段。但是這解決了我目前的需求。謝謝! –

0

如果可能的話,你可以在你的基類像創建其他「保護法」:

class MyLogicBase { 
    … 
    public virtual void UpgradeInstance(MyLogicBase newInstance) 
    { 
     //to override 
    } 
    protected CopyDatabase(MyLogicBase newInstance) { 
     m_Database = newInstance.m_Database; 
    } 

    protected List<string> m_Database = new List<string>(); } 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     base.CopyDatabase(newInstance); 
     … 
    } 
    …  
} 

或者,你可以嘗試使用反射來訪問受保護的領域,可以沿東西Accessing a class protected field without modifying original class

相關問題