我有一個類層次結構是這樣的:如何在c#中使用泛型時運行子類的overriden方法?
public abstract class BaseObject {
//even though this does not have abstract methods I declare it as abstract because I do not want it to be initialized
....
public void save(Connection con) {
con.InsertOrReplace(this);
}
....
}
public abstract CheckedDataObject : BaseDataObject {
....
public abstract new void save(Connection con);
}
這兩個類是由我的數據對象使用,其中一些只需要保存,另一些則在保存之前運行檢查,因爲檢查是在不同的CheckedDataObject保存方法是抽象的
例如:
public class Father : BaseDataObject {
}
這只是需要保存,BaseDataObject的保存工作正常,但:
public class Child : CheckedDataObject {
....
public override void save(Connection con) {
//do checks here to see if it is correct, if not throw an exception
con.Insert(this);
}
....
}
我的問題是,當我使用一個通用的方法來保存這樣的對象的列表(有些可能是父親,有些可能是小孩):
public void save_all<T>(Connection con, List<T> items) where T: BaseDataObject {
foreach (int idx = items.Count - 1 ; i >= 0 ; i--) {
//initializations and checks go here
items[i].save(con);
}
}
的問題是,保存()總是調用BaseDataObject的保存,即使被解析的項目是CheckedDataObject
如何更改我的方法,以便它將調用正確的保存方法?
預先感謝任何幫助,您可以提供
「BaseDataObject」在哪裏?或者'BaseObject'有拼寫錯誤?修復。 –
違反[Liskov替代原則](https://en.wikipedia.org/wiki/Liskov_substitution_principle)的好例子。 – Fabio
爲什麼你不只是讓基礎類中的虛擬保存允許人們覆蓋它呢?你的問題的標題表明,也許這就是你想要做的 - 你說話,就好像你已經覆蓋了方法,而不是創建一個全新的,這實際上你看起來已經完成了... – Chris