0

我有一个涉及继承的复杂情况。我有一个DataObject我的Invoice类继承自的基类。我想Invoice使用DataObjectsave 方法保存对象,然后返回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对象。我什至不确定这是否可能,但我真的希望它是可能的。

4

1 回答 1

3

在您的约束范围内工作,似乎最简单的方法是将 Save 声明为抽象(以及 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 返回的任何对象都必须是 a DataObject<T>,因为 Save 的默认实现return this;在 a 内部DataObject<T>(希望这是有道理的)。

您可以使用Curiously Recurring Template Pattern来做到这一点,但这样做需要您DataObject<T>从保存中返回 a,如下所示:

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

}
于 2013-08-23T22:05:11.327 回答