Почему я должен указывать конкретный тип параметров класса B при определении ограничения типа параметра в классе A на основе типа B? - PullRequest
0 голосов
/ 15 мая 2019

Я получил два базовых класса A и B; B относится к A по составу. Кроме того, оба класса имеют ограничения на параметры типа (универсальные классы), и в этом случае class A ограничивает один из своих типов параметров типом B. Так что мой вопрос ... при ограничении типа параметра class A типом B, , почему я должен также указывать типы параметра для класса B? Я только вижу, что должен предоставить B типы параметров, когда я наследую class B, а не когда его тип используется для ограничений типов параметров в классе.

Проверьте фрагмент кода, который иллюстрирует то, что я объясняю выше:

public abstract class B<TParameter, TResponse>
   where TParameter: FooParameter
   where TResponse: FooResponse
{

}

public abstract class A<T, TB>
  where T: class
  where TB: B /*compilation error because B types must be provided... I must define parameter types for class B*/
{
    public TB B {get; set;}

    public A()
    {
        //instantiate B property
    }
}

public class FooParameter {}

public class FooResponse {}

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Попробуйте:

   public abstract class A<T, TB, C, D>
      where T : class
      where C : FooParameter
      where D : FooResponse
      where TB : B<C,D>    {
      public TB B { get; set; }

      public A()
      {
         //instantiate B property
      }
   }

Вы должны иметь возможность определять все типы, которые нужны универсальному во время компиляции, что вы можете, как указано выше.

1 голос
/ 15 мая 2019

Когда вы создаете универсальный тип, вы создаете концептуальный «шаблон», а не полный тип. Он может стать полным типом, только если вы укажете недостающие части в шаблоне: конкретные типы.

Существуют ограничения типа, поэтому компилятор может добавить некоторую проверку типов. Даже если вы не знаете тип точный , который будет использоваться, если он наследуется от базы, вы знаете, какие члены базы доступны для вашего кода. Если вы попытаетесь ограничить параметр типа универсальным типом без аргументов типа, компилятору не хватит информации, чтобы понять, какие методы действительно будут доступны.

Например, если мы заменим TB: B на тип TB: List<T>, компилятор не будет знать, из какого списка. Методы типа Add(T) и Remove(T) не могут быть скомпилированы, потому что T будет неизвестен.

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

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