在基类中重新创建实例

时间:2009-10-19 11:33:23

标签: c# oop

我想知道是否可以将其基类中派生类的实例类型更改为来自同一基类的另一个派生类。以下我将尝试在代码中解释它。

public class ValueTypeClass
        {
            private string _Note;
            private String _Name;
            private nodeClass refrenceNode ;
    //...
            }

public class refrenceDBClass : valuetypeclass
{
//...
}

public class refrenceFileClass : valuetypeclass
{
//...
}

现在每次更改refrenceNode时我想根据refrenceNode属性更改实例的类型

编辑1: 现在我通过另一个保留refrencedbclass和refrencefileclass细节的类来做这个,每次更改refrencenode我都在创建一个新实例。

public class ValueTypeClass
            {
                private string _Note;
                private String _Name;
                private nodeClass refrenceNode ;
                private detailClass detailInfo ;
        //...
                }


public class detailClass
{
//...
}
    public class refrenceDBClass : detailClass
    {
    //...
    }

    public class refrenceFileClass : detailClass
    {
    //...
    }

2 个答案:

答案 0 :(得分:4)

在C#中,实例永远不会更改其类型。

我不明白你想用这个解决的问题,但我认为你应该聚合你想要改变的这种类型,并在某些值发生变化时创建一个新实例。例如,与策略模式一样。

答案 1 :(得分:2)

您无法更改托管.NET对象的类型。如果您封装对象(在包装器中 - 例如refrenceNode),您可以交换引用,但这就是它。

在某些(有限的)情况下,您可能能够序列化/反序列化封装的实例,更改流程中的类型(仅适用于基于合同的序列化程序,具有兼容的合同;非常不可能)。您当然无法更改当前实例的类型。


重新编辑;再次,你不能改变你揭露细节的方式,但通过一些铸造,你可以使它工作;含糊地,像是:

public class ValueTypeClass
{
    private string _Note;
    private String _Name;
    private nodeClass refrenceNode;
    public nodeClass ReferenceNode {
        get {return refrenceNode;}
        set {
            if(refrenceNode == value) return; // nop
            refrenceNode = value;
            BuildDetailInfo();
        }
    }
    private detailClass detailInfo;
    public detailClass DetailInfo {get {return detailInfo;}}
    private void BuildDetailInfo() {
        // TODO: decide on the appropriate type (based on refrenceNode)
        // and recreate detailInfo
    }
}

听起来你也应该利用多态性。如果你正在进行数据绑定,你可以做一些其他事情(付出相当大的努力)来使它更友好,但它不会影响常规代码。