我有一些涉及继承的复杂情况。我有一个基础DataObject
类,我的Invoice
类继承自该类。我想使用Invoice
保存方法保存DataObject
对象,然后返回刚刚保存的Invoice
对象。
public abstract class DataObject {
public virtual DataObject Save() {
// Save data
return this;
}
}
派生类
public class InvoiceObject : DataObject {
// base data for the class goes here
}
public class Invoice : InvoiceObject {
public override DataObject Save() {
// Somehow return an Invoice object here
return base.Save();
}
}
如果可能,我想避免使用强制转换。任何见解都会有所帮助。为了论证,结构必须保持不变。我无法删除InvoiceObject
对象,Save
方法必须返回保存到数据库的整个Invoice
对象。我甚至不确定这是否可行,但我真的希望它是。
答案 0 :(得分:3)
在你的约束条件下工作,似乎最简单的方法就是声明Save as abstract(以及InvoiceObject),并让具体的模板化子类覆盖它,如下所示:
public abstract class DataObject<T> {
public abstract T Save();
}
public abstract class InvoiceObject<T> : DataObject<T> {
// base data for the class goes here
}
public class Invoice : InvoiceObject<Invoice> {
public override Invoice Save() {
return this;
}
}
编辑:在回复你的评论时,默认的“保存”实现意味着Save返回的任何对象必须是DataObject<T>
,因为return this;
内的Save的默认实现是DataObject<T>
1}}(希望有道理)。
您可以使用Curiously Recurring Template Pattern执行此操作,但这样做需要您从保存中返回DataObject<T>
,如下所示:
public abstract class DataObject<T> where T : DataObject<T>{
public virtual DataObject<T> Save(){
return this;
}
}
public abstract class InvoiceObject<T> : DataObject<T> where T : DataObject<T> {
// base data for the class goes here
}
public class Invoice : InvoiceObject<Invoice> {
}