Переопределение методов Dart с помощью аргументов Generics - PullRequest
1 голос
/ 19 февраля 2020

У меня есть такой случай, когда я расширяюсь от суперкласса с методами, набираемыми с использованием Generics следующим образом:

Модели

abstract class SuperClass { 

   //.....
}


class SubClass extends SuperClass {
  int a;
  int b;
  String c;
  //....
}

Контроллеры

abstract class A {
   T getDoc<T extends SuperClass>(T doc);
} 

class B extends A {
   T getDoc<T extends SubClass>(T doc) {     //<================ Error
       //....
    }       
}

В основном класс B будет работать только с моделью SubClass и любым классом, который ее расширяет. Расширение SuperClass недостаточно. Это способ обеспечить использование типа. Я мог бы добавить вспомогательную функцию, которая будет проверять тип для каждого метода в классе B (doc is SubClass), но выглядит как многократное повторение.

Но приведенная выше архитектура дает сбой при переопределении метода getDoc в класс B говорит, что это недопустимое переопределение, хотя SubClass является SuperClass. Как я могу достичь чего-то подобного? Или есть лучший способ сделать это? Цени любые указатели:)

Ответы [ 3 ]

0 голосов
/ 20 февраля 2020

Наконец-то я нашел способ:)

Итак, я хотел, чтобы методы класса B принимали исключительно типы, расширяющие SubClass, но сигнатура метода A ожидает параметры, расширяющие класс SuperClass.

К go По этому поводу я сделал следующее:

Модели

abstract class SuperClass { 

   //.....
}


class SubClass extends SuperClass {
  int a;
  int b;
  String c;
  //....
}

Контроллеры

abstract class A<K extends SuperClass> {
   T getDoc<T extends K>(T doc);
} 

class B extends A<SubClass> {
   T getDoc<T extends SubClass>(T doc) {     
          //.......
    }       
}

0 голосов
/ 05 апреля 2020

можете ли вы использовать ковариантный модификатор.

В вашем примере:

abstract class A {
   T getDoc<T extends SuperClass>(covariant T doc);
} 

Проверка: https://github.com/dart-lang/sdk/blob/master/docs/language/informal/covariant-overrides.md

0 голосов
/ 19 февраля 2020

Нельзя сузить типовой аргумент c. Класс B гарантирует (расширяя класс A), что он будет / может обрабатывать все аргументы типа (и подтипы!), Которые может обрабатывать класс A. Рассмотрим следующую ситуацию:

class OtherSubClass extends SuperClass {
  //....
}

void main() {
  var b = B();
  b.getDoc(OtherSubClass());
}

Что бы вы ожидали? Класс B не может обрабатывать объекты типа OtherSubClass, поэтому он нарушает договор с классом A.

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