2017-09-02 75 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

相关问题