[英]Casting a Generic Type in implemented abstract class
我想用一個采用通用類型的抽象方法創建一個抽象類。 我的實現類方法將對該類型執行某些操作,但是由於其泛型,我無法訪問該方法中傳遞的真實對象的屬性。 如果我嘗試強制轉換,那么它將無法編譯,因為您無法強制轉換回T類型。 我的意思的一個例子。
public abstract class TestAbstractClass
{
public abstract void Method<T>(ref IQueryable<T> query);
}
public class TestA:TestAbstractClass
{
// T in this class is an object with a property called Forename
public override void Method<T>(ref IQueryable<T> query)
{
query = query.OrderBy(o=>o.Forename); // unaware of property forename
query = ((IQueryable<Person>)query).OrderBy(o=>o.Forename); // breaks because of casting
}
}
public class TestB:TestAbstractClass
{
// T in this class is an object with a property called HandSize
public override void Method<T>(ref IQueryable<T> query)
{
query = query.OrderBy(o=>o.HandSize); // unaware of property
query = ((IQueryable<Glove>)query).OrderBy(o=>o.HandSize); // breaks because of casting
}
}
我希望這是有道理的,而且我也不會傻。
干杯
解決方案可能是:
public abstract class TestAbstractClass<T>
{
protected virtual void Method(ref IQueryable<T> query)
{
}
}
class TestA : TestAbstractClass<Person>
{
protected override void Method(ref IQueryable<Person> query)
{
var q = query.OrderBy(p => p.Forename);
}
}
該代碼很脆弱,因為很容易破壞它。 通過查看該方法,沒有人能知道子類僅允許一種類型的實體。
有一個稱為Liskovs Substitution Principle的原則,該原則表示,采用基類的任何方法都應能夠與任何種類的子類一起使用。 在這種情況下,可以將<T>
說明符與object
進行比較。
我認為您打算這樣做:
public abstract class TestAbstractClass<T>
{
public abstract void Method(ref IQueryable<T> query);
}
public class TestA : TestAbstractClass<Person>
{
// T in this class is an object with a property called Forename
public override void Method(ref IQueryable<T> query)
{
query = query.OrderBy(o=>o.Forename); // unaware of property forename
}
}
public class TestB:TestAbstractClass<Glove>
{
// T in this class is an object with a property called HandSize
public override void Method(ref IQueryable<T> query)
{
query = query.OrderBy(o=>o.HandSize); // unaware of property
}
}
區別在於,您指定整個類只能與一種類型的實體一起使用,從而使您可以獲取智能感知等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.