Last active
February 7, 2022 14:26
-
-
Save OnlyTarg/84baebf556dfefecc6608bd177afd8db to your computer and use it in GitHub Desktop.
fields_at_abstract_classes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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