我正在为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
,不是吗?
答案 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中修复的错误。