Общие методы приводят это к T

1

У меня этот класс

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);

как я могу избежать приведения?

большое спасибо.

Теги:
generics

1 ответ

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);
    }
}
  • 0
    ах хорошо большое спасибо !!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню