2009-02-23 2 views
2

У меня есть интерфейс с одним параметром универсального типа:Объявление наследственных родовые со сложными ограничениями типа

public interface IDriveable<T> where T : ITransmission { ... } 

У меня также есть класс, который имеет параметр типа, который должен быть таким типа интерфейса:

public class VehicleFactory<T> where T : /* ??? */ 

Здесь есть проблема с этой декларацией. Я не могу поставить «IDriveable», потому что он не имеет параметров типа и не соответствует сигнатуре типа IDriveable. Но я также не хочу ставить IDriveable <U>, потому что тогда VehicleFactory должен знать, что вид IDriveable он получает. Я хочу, чтобы VehicleFactory принимал любой вид IDriveable.

Предлагаемый раствор Коллега имел был использовать:

Но мне не нравится это, так как это излишнее. Я должен сказать тип «U» дважды:

var factory = new VehicleFactory<IDriveable<AllWheelDrive>, AllWheelDrive>(); 

Что должно быть в вопросительных знаках?

+0

Зачем нужен параметр IDriveable ?Не можете ли вы использовать IDriveable внутри класса и получить только параметр AllWheelDrive? – configurator

ответ

0

Это работает для вас?

Это позволит фабрике узнать, какие типы приводных устройств.

+0

похоже, что вы были на одну минуту быстрее меня, точно такой же ответ ;-) – Mouk

+0

Это кажется менее оптимальным. Мне не нужно писать «VehicleFactory , AllWheelDrive>"? Это своего рода избыточность. – sassafrass

0

Вы можете определить CarFactory с 2-мя типами дженериков и перенести один из них на интерфейс. что-то вроде:

public class VehicleFactory<T1,T2> where T1 : IDriveabel<T2> 

Я надеюсь, что это не то, что вы имеете с Idriveable. Я предполагаю, что U - особый тип. Как и String, и т. Д.

3

Что такое VehicleFactory по состоянию на do с T? Действительно ли это необходимо для того, чтобы работать, или это просто для проверки работоспособности разработчика?

Один из распространенных способов обойти это объявить, не универсальный интерфейс (IDriveable), а затем сделать ваш общий один простираться, что:

public interface IDriveable {} 
public interface IDriveable<T> : IDriveable {} 
public class VehicleFactory<T> where T : IDriveable 

Если вы сделать хотите завод, чтобы быть в состоянии сделать что-то с T, вы можете поместить любые элементы интерфейса от IDriveable<T>, которые не заботятся о T в нежизнеспособном IDriveable.

+0

Завод должен иметь возможность делать что-то с параметром типа IDriveable. Кроме того, я не думаю, что это решение работает, потому что IDriveable имеет ограничения типа в исходном примере, и я думаю, что здесь могут возникнуть ошибки (если не компиляции?). – sassafrass

+0

Интересно, на самом деле я не пытаюсь получить свой торт и съесть его тоже здесь. Кажется, есть конструктивное решение, сделанное языком, чтобы не допускать такого рода вещи неявно, возможно, с очень веской причиной. – sassafrass

+0

Ну, с одной стороны, один тип может реализовывать несколько интерфейсов IDriveable ... которые T должен выбрать? –

0

Вы можете сократить часто используемые случаи, как это:

interface IDriveableAllWheel : IDriveable<AllWheelDrive> 
{} 

var factory = new VehicleFactory<IDriveableAllWheel, AllWheelDrive>(); 

или даже

class AllWheelFactory : VehicleFactory<IDriveableAllWheel, AllWheelDrive> 
{} 

также видит ответ на KVB в в Calling Generic Property In Generic Class From Interface Implemented By Generic Class для возможного решения проблемы.

Смежные вопросы