C # Реализовать производные типы определения интерфейса? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть дерево наследования, которое выглядит так:

Foo и Bar оба имеют Id, как определено определенным классом Id. Классы id являются производными от общего базового класса.

Теперь я хотел бы написать интерфейс, который может включать как Foo, так и Bar, но компилятор не позволяет этого, я должен был бы использовать BaseId в качестве типа в Foo и Bar, но я бы хотел этого избежать.

public class BaseId
{
    public string Id {get; set;}
}

public class FooId: BaseId
{}

public class BarId: BaseId
{}

public interface MyInterface
{
    public BaseId Id {get; set; }
}

public class Foo: MyInterface
{
    public FooId Id {get; set;}
}

public class Bar: MyInterface
{
    public BarId Id {get; set;}
}

1 Ответ

0 голосов
/ 30 апреля 2018

Обобщения могут помочь здесь. Сначала вы определяете интерфейс следующим образом:

public interface IMyInterface<out T> where T : BaseId {
    T Id { get; }
}

И тогда вы можете реализовать это так:

public class Foo : IMyInterface<FooId> {
    public FooId Id { get; set; }
}

public class Bar : IMyInterface<BarId> {
    public BarId Id { get; set; }
}

Достижение цели использования BarId и FooId в определенных классах.

Оба класса также можно преобразовать в IMyInterface<BaseId> в случае, если вы не знаете точный тип идентификатора:

Foo foo = new Foo();
// works fine
var asId = (IMyInterface<BaseId>)foo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...