我有这个班级
class A
{
public string OnlyOnA { get; private set; }
public virtual void Accept<T>(ITaker<T> ia) where T : A
{
ia.Take((T)this);
}
}
和这个界面
interface ITaker<T> where T : A
{
void Take(T a);
}
有了这个我可以像下面的
那样继承Aclass B : A
{
public string OnlyOnB { get; private set; }
}
并实现界面
class BTaker : ITaker<B>
{
public void Take(B b)
{
var v = b.OnlyOnB;
}
}
我在Taker类中获得灵活性以获得A的正确类型和A的子类型。 但是我仍然需要A中的演员,我必须做(T)这个;
我该如何避免演员?
非常感谢。答案 0 :(得分:3)
您要做的事情是不安全的,因为您可以这样做:
new A().Accept(new BTaker());
为了确保安全,您可以创建一个新界面来指定可以接受的T
类型。
interface IAccept<T> where T : A
{
void Accept(ITaker<T> taker);
}
class A : IAccept<A>
{
public string OnlyOnA { get; private set; }
public virtual void Accept(ITaker<A> ia)
{
ia.Take(this);
}
}