Как определить класс, который точно такой же, как и другой класс в Dart/Flutter

#flutter #dart #exception #inheritance

Вопрос:

Я определяю некоторые пользовательские исключения в Dart.

Я хочу в своей логике проверить тип исключения и основывать свою обработку на этом, поэтому я хочу создать отдельные классы для каждого, например, как это :

 class FailedToLoadCriticalDataException implements Exception { }  // app cannot continue
class FailedToLoadNonCriticalDataException implements Exception { } // app can continue
 

Однако я также хочу передать 2 параметра при создании исключений этих типов, тип вызова API и URL-адрес API, а определение для этого будет выглядеть следующим образом :

 class UrlCallFailedException implements Exception {
    
    String _dataTypeName;
    String _urlEndpoint;
  
    UrlCallFailedException([this._dataTypeName, this._urlEndpoint]);
  
    @override
    String toString() {
      return "(${this.runtimeType.toString()}) Failed to fetch $_dataTypeName ($_urlEndpoint)";
    }
}
 

Теперь то, что я хочу сделать, это (заменить первоначальные определения, которые я сделал ранее, и повторно)определить мои FailedToLoadCriticalDataException FailedToLoadNonCriticalDataException классы и так, чтобы они были точно тем кодом, который находится в UrlCallFailedException классе.

Есть ли какой-нибудь способ просто сказать что-то вроде class FailedToLoadCriticalDataException **is** UrlCallFailedException; и не нужно дублировать код, который определяет UrlCallFailedException ?

class FailedToLoadCriticalDataException implements UrlCallFailedException{ } неверно, потому что в нем «Отсутствуют конкретные реализации» исключения URL-адреса получателя._dataTypeName»,..»

class FailedToLoadCriticalDataException extends UrlCallFailedException{ } это неправильно, потому что, когда я добрался до throw FailedToLoadNonCriticalDataException("Foo", url); этого, ожидалось, что параметров нет («Слишком много позиционных аргументов: ожидается 0, но найдено 2»).

Есть ли способ создать несколько классов, которые ведут себя точно так же, как и другой тип, и отличаются только своим классом, без дублирования всего кода ?

Ответ №1:

Я придумал это как достойный компромисс :

 class FailedToLoadCriticalDataException extends UrlCallFailedException { 
  FailedToLoadCriticalDataException([dataTypeName, urlEndpoint]) {
    super._dataTypeName = dataTypeName;
    super._urlEndpoint = urlEndpoint;
  }
}  
class FailedToLoadNonCriticalDataException extends UrlCallFailedException { 
  FailedToLoadNonCriticalDataException([dataTypeName, urlEndpoint]) {
    super._dataTypeName = dataTypeName;
    super._urlEndpoint = urlEndpoint;
  }
} 
 

Некоторое, но минимальное дублирование кода, и теперь я могу вызвать throw FailedToLoadNonCriticalDataException("Foo", url); свой код позже.