Доступ к методу, который отсутствует в базовом интерфейсе - PullRequest
1 голос
/ 13 апреля 2011

У меня проблема с дизайном, и я ищу лучшее дизайнерское решение.Я добавил пример проблемы ниже.

public interface IVehicle<T>
{
    int GetEngineSize();
}

public class Car : IVehicle<Car>
{
    public int GetEngineSize()
    {
        throw new NotImplementedException();
    }

    public bool HasSpolier()
    {
        return true;
    }
}

public class Bus : IVehicle<Bus>
{
    public int GetEngineSize()
    {
        throw new NotImplementedException();
    }
}

public abstract class BaseController<T>
{
    public IVehicle<T> Repository { get; set; }
}

public abstract class CarController : BaseController<Car>
{
    public CarController()
    {
        // How can I access the HasSpolier method from the IVehicle<T> without having to cast the Interface to concrete class Car
        bool result = Repository.HasSpolier();
    }
}

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Я не уверен, что ваши генерики делают здесь то, что вы хотите.

Если вместо

IVehicle<T> Repository {get; set;}

Вы сделали

T Repository {get; set;}

Вы могли бы сделать1009 *

public abstract class BaseController<T> where T : IVehicle

Чтобы убедиться, что они имеют интерфейс IVehicle

Тогда у вас будет типизированный репозиторий и вы получите доступ к вашему методу спойлера.IVehicle<Bus> но, по крайней мере, в примере кода T никогда не используется в интерфейсе.На данный момент T ничего не стоит.

1 голос
/ 13 апреля 2011

Вы должны были бы разыграть свой репозиторий в машине.

Это сделает использование вашего интерфейса бессмысленным, так как вновь появится зависимость от реализации, которую вы пытаетесь удалить.

Кроме того, параметр типа в вашем интерфейсе не требуется, его нельзя использовать где-либо еще в интерфейсе ...

public interface IVehicle
{
    int GetEngineSize();
}
1 голос
/ 13 апреля 2011

Если вы не реализуете метод в интерфейсе, вы не сможете получить к нему доступ, не приведя его к другому классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...