1

我正在为 Petrel 编写一个 Ocean 插件,需要保留一些自定义域对象,而且一切似乎都指向使用结构化存档数据源。我创建了一个通用类来保存许多标准域对象(机器人、名称、颜色、图像、评论、历史等),以避免为我创建的每个域对象重写它。Ocean 开发指南只有简单的类没有继承的例子,但考虑到一切都有一个版本号,我预见到当基类版本与继承的版本不同时,一个潜在的问题-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,不应该吗?

4

1 回答 1

1

得到了斯伦贝谢的答复。这是可能的,通过做这样的事情:

[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 中修复的错误。

于 2014-04-21T17:10:06.980 回答