簡體   English   中英

在實現的抽象類中強制轉換泛型類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM