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
设置为通用。在阅读编辑之前提交了最后一条评论。伟大的解决方案!