在实现的抽象类中强制转换泛型类型

本文关键字:转换 泛型类型 实现 抽象类 | 更新日期: 2023-09-27 18:06:55

我想创建一个具有泛型类型的抽象方法的抽象类。我的实现类方法将对该类型做一些事情,但因为它是泛型的,我无法访问在方法中传递的真实对象的属性。如果我尝试转换,那么它不会编译,因为你不能转换回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);
    }
}

这段代码很脆弱,很容易被破坏。没有人能从这个方法中看出这个子类只允许一种类型的实体。

有一个叫做liskov替代原则的原则,它说任何接受基类的方法都应该能够处理任何类型的子类。在本例中,可以将<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
   }
}

不同之处在于你指定整个类只能使用一种类型的实体,这种实体允许你获得智能感知等