如何使外部对象的字段中derivered类
问题描述:
访问我想创建一个类下面的例子:如何使外部对象的字段中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
}
答
只是委托能力的基类。您甚至可以在该类中声明虚拟方法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);
…
}
…
}
答
如果可能的话,你可以在你的基类像创建其他“保护法”:
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
您好!感谢您的快速回复。意外的是,我写了一个代码示例,它不显示我想解决的问题。我很抱歉我的错误。更正它。问题是我希望派生类使用基类对象进行自身设置,而基类对象的文件仍然保留为其他类。 –
@KamilKowalewski解决方案仍然是一样的。 'UpgradeInstance'虚拟方法是复制'm_Database'字段的正确位置。如果出于任何原因,您不希望在基类“UpgradeInstance”中出现像这样的共同行为,请为此目的另外声明一个方法。 –
这使它比我更复杂一点,尽管它可能是。不同的派生类可以以不同的方式使用不同的基类字段。但是这解决了我目前的需求。谢谢! –