Skip to content

Instantly share code, notes, and snippets.

@OnlyTarg
Last active February 7, 2022 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OnlyTarg/84baebf556dfefecc6608bd177afd8db to your computer and use it in GitHub Desktop.
Save OnlyTarg/84baebf556dfefecc6608bd177afd8db to your computer and use it in GitHub Desktop.
fields_at_abstract_classes
// ignore_for_file: avoid_print
/// Проблематика:
/// Как правильно объявлять переменные в абстрактных класах, чтоб в классах которые их имплементируют, эти переменные можно
/// было переопределять как immutable так и muttable (с ключевым словом final так и без)
///Вариант первый. использвать late final
///В таком случае в классе который имплементится от этого абстрактного класса это поле можно использовать без ключевого слово final
///Если в реализации нужно использвать immutable переменную - нужно реализовывать еще и сеттер.
///Так же в документации рекомендуется не использовать late final (https://dart.dev/guides/language/effective-dart/design#avoid-public-late-final-fields-without-initializers)
abstract class SomeAbstractClass1 {
late final String someField;
String someMethod();
}
class SomeClass1 implements SomeAbstractClass1 {
SomeClass1(this.someField);
//Попробуй поставить final тут
@override
/* final */ String someField;
@override
String someMethod() {
throw UnimplementedError();
}
}
/// Второй вариант использовать геттер а абстрактном классе. Ответ взял тут (https://github.com/dart-lang/sdk/issues/28555)
/// В этом случае при реализации нашего класса мы мыжем делать поле как final так и нет
/// Склоняюсь к этому решению как к более правильному
abstract class SomeAbstractClass2 {
String get someField;
String someMethod();
}
class SomeClass2 implements SomeAbstractClass2 {
SomeClass2(this.someField);
//Попробуй убрать final тут
@override
final String someField;
@override
String someMethod() {
throw UnimplementedError();
}
}
/// Вариант 3 отметить эту переменную как nullable. Но это очень чревато ошибками. Так как тот кто будет реализовывать класс
/// может просто не инициализировать ее
abstract class SomeAbstractClass3 {
String? someField;
String someMethod();
}
class SomeClass3 implements SomeAbstractClass3 {
SomeClass3(this.someField);
@override
String someMethod() {
throw UnimplementedError();
}
@override
String? someField;
}
void main() {
final dummy1 = SomeClass1('test_message1');
dummy1.someField = '1222121';
print(dummy1.someField);
final dummy2 = SomeClass2('test_message2');
print(dummy2.someField);
//dummy2.someField = '1212';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment