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