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

C# 复杂的继承情况。从派生类返回基对象,c#,asp.net,inheritance,C#,Asp.net,Inheritance,我有一个有点复杂的情况涉及继承。我有一个基本的DataObject类,我的Invoice类继承自该类。我想使用DataObjectsave方法保存Invoice对象,然后返回刚刚保存的Invoice对象 public abstract class DataObject { public virtual DataObject Save() { // Save data return this; } } 派生类 public class Invoic

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

在您的约束范围内,似乎最简单的方法是将Save声明为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;
    }
}
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> {

}

在约束范围内工作,最简单的方法似乎是将Save声明为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;
    }
}
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> {

}


我不确定这是否是您想要的,您必须在InvoiceObject中实现Save(),并从那里调用base.Save()。不要从Invoice返回base.Save(),而是从Invoice返回它?您能使用接口而不是类继承吗?我更喜欢使用继承,因为这样可以实现一次保存,并根据需要在继承树的下一步对其进行更改。@Peter差不多,但不完全一样。我不想将
发票
指定为
数据对象
。我只想指定
Invoice
是一个
InvoiceObject
,而from extension是一个
DataObject
我不确定这是否是您想要的,您必须在InvoiceObject中实现Save(),并从中调用base.Save()。不要从Invoice返回base.Save(),而是从Invoice返回它?您能使用接口而不是类继承吗?我更喜欢使用继承,因为这样可以实现一次保存,并根据需要在继承树的下一步对其进行更改。@Peter差不多,但不完全一样。我不想将
发票
指定为
数据对象
。我只想指定
Invoice
是一个
InvoiceObject
,而from extension是一个
DataObject
+1,但是您可以给DataObject一个带有where T:DataObject的约束,并且可以很容易地删除InvoiceObject,但是我试图避免为每个对象实现
Save
,因为大多数对象都会使用“默认值”Save方法和很少几个方法的实现方式必须与基类不同。您可以创建一个属性,并在基类中使用反射来枚举所有要序列化的属性。这与我们所寻找的不完全一样,但@DavidN的实现方式与我所能得到的最接近。我决定去掉
InvoiceObject
并将
DataObject
设置为通用。在阅读编辑之前提交了最后一条评论。伟大的解决方案+1,但是您可以给数据对象一个where T:DataObject的约束,您可以很容易地删除invoiceobject,但是我试图避免为每个对象实现
Save
,因为大多数对象都会使用“default”Save方法和很少几个方法的实现方式必须与基类不同。您可以创建一个属性,并在基类中使用反射来枚举所有要序列化的属性。这与我们所寻找的不完全一样,但@DavidN的实现方式与我所能得到的最接近。我决定去掉
InvoiceObject
并将
DataObject
设置为通用。在阅读编辑之前提交了最后一条评论。伟大的解决方案!