У меня этот класс
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);
}
с этим я могу подклассировать A как следующий
class B : A
{
public string OnlyOnB { get; private set; }
}
и реализовать интерфейс
class BTaker : ITaker<B>
{
public void Take(B b)
{
var v = b.OnlyOnB;
}
}
Я получаю flexibilty в классе Taker, чтобы получить правильный тип A и подтипы A., но мне все равно нужно сделать бросок в A, где я должен это делать (T);
как я могу избежать приведения?
большое спасибо.
То, что вы пытаетесь сделать, небезопасно, поскольку вы можете сделать:
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);
}
}