复杂的继承情况。从派生类返回基础对象

时间:2013-08-23 21:43:10

标签: c# asp.net inheritance

我有一些涉及继承的复杂情况。我有一个基础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对象。我甚至不确定这是否可行,但我真的希望它是。

1 个答案:

答案 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> {

}