具有从公共类继承的多个域对象的结构化归档

时间:2014-04-14 17:11:33

标签: ocean petrel

我正在为Petrel编写一个Ocean插件,需要保留一些自定义域对象,一切似乎都指向使用结构化存档数据源。我创建了一个公共类来保存很多标准的域对象(droid,名称,颜色,图像,注释,历史等),以避免为我创建的每个域对象重写它。 Ocean开发指南只有没有继承的类的简单示例,但鉴于所有内容都有版本号,我预见当基类版本不同于inherited-class-1版本时可能存在的问题,该版本与继承版本不同 - class-2,然后我在基类中更新一些东西。

是否可以使用具有公共基类的结构化存档?版本控制是否有任何特殊注意事项,或者我需要注意的其他任何事项?

ETA:一个简单的类图,显示了我尝试过的关系和一些东西

public abstract class ClassA
                    |
       -----------------------------------
       |                                 |
public class ClassB : ClassA       public classC : ClassA


public class ClassD
{
    private List<ClassA> _myClassAObjects;
}

所有课程都标记为Archivable,而在ClassD中,_myClassAObjects标记为Archived。一切都保存好,但是当我加载时,我得到一个InvalidCastException,因为它试图将List<ClassB>转换为List<ClassA>。投射应该有效,因为ClassB继承自ClassA,不是吗?

1 个答案:

答案 0 :(得分:1)

Schlumberger得到了答案。通过做这样的事情是可能的:

[Archivable]
public abstract class Abstract CDO
{

    [ArchivableContextInject]
    protected StructuredArchiveDataSource DataSourceCore;

    [Archived(Name = "Name")]
    private string _name;

    private AbstractCDO _parent;

    [Archived(Name="ParentDroid")]
    private Droid _parentDroid;

    [Archived(Name = "Droid")]
    protected Droid DroidCore
    {
        get { return _droid; }
        set
        {
            if (_droid != value)
            {
                DataSourceCore.IsDirty = true;
                _droid = value;
            }
        }
    }

    public Droid ParentDroid
    {
        get { return _parentDroid; }
        set
        {
            if (_parentDroid != value)
            {
                DataSourceCore.IsDirty = true;
                _parentDroid = value;
            }
        }
    }

    public AbstractCDO Parent
    {
        get { return _parent; }
        set
        {
            if (_parent != value)
            {
                DataSourceCore.IsDirty = true;
                _parent = value;
                _parentDroid = _parent.Droid;
            }
        }
    }

    protected AbstractCDO(string name)
    {
        _name = name;
        DataSourceCore = Factory.Get();
        _droid = DataSourceCore.GenerateDroid();
        DataSourceCore.AddItem(_droid, this);
    }

}

[Archivable]
public abstract class AbstractCDOCollection : AbstractCDO, IObservableElementList
{

    [Archived]
    private List<AbstractCDO> _children;

    protected AbstractCDO(string name) : base(name) { }

    public List<AbstractCDO> Children
    {
        get { return _children; }
    }

}

[Archivable]
public class ConcreteObject : AbstractCDO
{

    public ConcreteObject(string name) : base(name)
    {
        // other stuff
    }

}

DataSource属性需要受到保护,因为注入有一个在Petrel 2013.3 / 2014.1中修复的错误。