#c# #java #templates
#c# #java #шаблоны
Вопрос:
Я пытаюсь перевести этот фрагмент кода с Java на C #, и у меня возникают проблемы с поиском правильного synthax
Java:
public class MyClass<T extends IMyInterface<T>>
Моя попытка перевода на C#:
public class MyClass<T, U> where T: IMyInterface<U>
Если я это сделаю public class MyClass<T> where T: IMyInterface<T>
, ошибки компиляции при объявлении класса не будет, но я не могу понять, как использовать класс.
Более конкретно, у меня есть интерфейс IPoint<T>
, который реализован классом EuclideanPoint:IPoint<EuclideanPoint>
. Кроме того, у меня есть шаблонный класс Clusterer<U>
, который не должен заботиться о параметре шаблона интерфейса, он должен только убедиться, что U имеет тип IPoint.
Спасибо.
Комментарии:
1. Это класс, который будет реализовывать IMyInterface ?
2. открытый класс MyClass<T> :IMyInterface<T> ?
3. Нет, я не пытаюсь реализовать интерфейс. Я пытаюсь использовать e шаблонный интерфейс в качестве параметра типа для шаблонного класса
Ответ №1:
Нет, эквивалент Java на C # был бы просто:
public class MyClass<T> where T : IMyInterface<T>
Один параметр типа в Java, один в C #.
То, как вы используете класс, будет зависеть от того, что IMyInterface<T>
такое и что его реализует. Например, если бы это было IEquatable<T>
вместо этого, вы могли бы создать MyClass<int>
потому что int
реализует IEquatable<int>
.
Комментарии:
1. Я пробовал эту версию, но когда я пытаюсь сделать это: MyClass<IMyInterface<T>> c = new MyClass<IMyInterface<T>>(), я получаю что-то вроде «Нет неявного преобразования ссылки из ‘IMyInterface<T>’ в ‘IMyInterface<IMyInterface<T>>'», где T — другой параметр шаблона
2. @ratzinho: Нет, все верно — потому что это может быть что-то вроде
class Foo : IMyInterface<Bar>
, что не удовлетворяет контракту. Было бы действительно полезно, если бы вы могли объяснить, чего вы пытались достичь.3. Ваша подсказка была очень полезной. Мне удалось сделать это: MyContainerClass<T> где T: IMyInterface<T> а затем, внутри MyContainerClass, я создал экземпляр класса следующим образом: MyClass<T> c = new MyClass<T>()
Ответ №2:
class MyClass<T> where T: IMyInterface<T>
выглядит неплохо.
Если у вас есть
class MySecondClass : IMyInterface<MySecondClass>
{
}
затем вы можете использовать
MyClass<MySecondClass> obj = new MyClass<MySecondClass>();