Параметр шаблона C # как интерфейс шаблона

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