在实现的抽象类中强制转换泛型类型
本文关键字:转换 泛型类型 实现 抽象类 | 更新日期: 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
}
}
不同之处在于你指定整个类只能使用一种类型的实体,这种实体允许你获得智能感知等