La asignación de campo no funciona según lo previsto en Dart

Resuelto TSR asked hace 9 meses • 0 respuestas
class FooBase {
  String? name;

  FooBase({required this.name});
}
class Foo  extends FooBase{
  final String name;

  Foo({required this.name}) : super(name: name);
}

void main() {
  final foo = Foo(name: 'foo');
  final fooForm = foo;
  fooForm.name = 'bar';
  print(fooForm.name);
}

Esperaría que este código imprimiera "bar" pero imprime "foo". ¿Porque?

¿Cómo hacer que imprima "barra"?

TSR avatar Feb 16 '24 07:02 TSR
Aceptado

Tiene dos namecampos: uno FooBaseque proporciona implícitamente un captador y un definidor y finalotro en la Fooclase derivada que proporciona solo un captador implícito.

Por lo tanto, cuando lo hace, fooForm.name = 'bar';invoca al FooBase.namedefinidor, ya que la clase derivada noFoo lo anula . Cuando leas más tarde fooForm.name, invocas el namecaptador, que es anulado por la Fooclase derivada para devolver la 'foo'cadena original.

La moraleja es:

  • Anular campos suele ser una mala idea . (Hay una pelusa para advertir sobre esto ). En su lugar, anule los captadores y definidores.

  • De todos modos, intentar hacer que un campo no se pueda escribir en una clase derivada es una mala idea. Al hacerlo, se rompe la interfaz y se rompe el principio de sustituibilidad de Liskov .

jamesdlin avatar Feb 16 '2024 00:02 jamesdlin