Интерфейс, указывающий, что класс должен иметь свойство ICollection <T>

1

Мне нравится создавать интерфейс, указывающий, что класс должен иметь хотя бы одно свойство ICollection

   public interface ILinked<T> where T : class, IModel
    {
        ICollection<T> LinkedT { get; set; }
    }

но я хочу, чтобы класс реализации мог свободно выбирать фактическое имя свойства. Это возможно?

  • 1
    Почему вы хотите применить эти конкретные критерии? Какую проблему вы пытаетесь решить, делая это?
  • 1
    Как код, использующий один из этих объектов, использует этот интерфейс?
Показать ещё 2 комментария
Теги:
interface

2 ответа

2
Лучший ответ

Это невозможно; в С# интерфейс не может определить тип и модификаторы доступа самостоятельно, не указывая имя.

Поскольку вы формулируете требование наличия "хотя бы одного свойства, если ICollection", возможно, проблема может быть решена путем определения свойства типа ICollection<ICollection<object>>.

2

В некотором смысле, да. Вам просто нужно указать, какое свойство вашего класса является тем, которое реализует свойство интерфейса. В конце концов, с этой сигнатурой может быть несколько свойств, и компилятор должен знать, что делать, когда к someVariableOfTypeILinkedT.LinkedT обращается какое-то someVariableOfTypeILinkedT.LinkedT. Это можно сделать, реализовав интерфейс явно.

Для этого С# требует немного кода котельной...

class MyClass : ILinked<MyParameter> {
    public ICollection<MyParameter> SomeArbitraryProperty { get; set; }

    ICollection<MyParameter> ILinked<MyParameter>.LinkedT
    { 
        get { return SomeArbitraryProperty; }
        set { SomeArbitraryProperty = value; }
    }
}

... в то время как VB.NET в этом случае является более кратким и позволяет напрямую сопоставить реализацию с методом интерфейса:

Class MyClass
    Implements ILinked(Of MyParameter)

    Public Property SomeArbitraryProperty As ICollection(Of MyParameter) _
        Implements ILinked(Of MyParameter).LinkedT
End Class

Ещё вопросы

Сообщество Overcoder
Наверх
Меню