假設我有一個基類BaseFoo和一個方法來處理完全由 BaseFoo 組成的資料結構:
public class BaseFoo { // FWIW, in my "real" example, this is an abstract base class
public void Func(IEnumerable<BaseFoo> data) {
// impl.
}
}
然后我有一些子類,Bar并且Baz:
public class Bar : BaseFoo {}
public class Baz : BaseFoo {}
但是我意識到我的引數Func包含所有相同型別的物件并且型別與子類匹配非常重要!如果Bar.Func傳遞了繼承的方法,可能會發生災難new[] {new Bar(), new Baz()}。
我如何在 的宣告中強制執行此操作BaseFoo.Func?(我不能使用泛型<T> where T : BaseFoo,因為編譯器只會使用BaseFoofor T,最后一段末尾的壞例子會編譯。)
編輯:
也許是一個更好的例子:我想Bar在我的Bar子類中存盤一個s串列,對于Baz. 但是我想在FooBasefor 中寫一個宣告List<this.GetType()>,完全知道不會編譯。我只是在尋找一種在基類中使用任意子型別別的方法。
uj5u.com熱心網友回復:
一種方法是使用泛型
例子
public class BaseFoo<T>
{
public void Func(IEnumerable<T> data) { }
}
public class Bar : BaseFoo<Bar> {}
public class Baz : BaseFoo<Baz> {}
意思是
var bar = new Bar()
bar.Func(new List<bar>()) // can only ever take an enumerable of bar
免責宣告:這不考慮您在概念上或其他方面可能遇到的任何其他問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335846.html
