flutter Dart:如果两个不同的子类中有两个相同的函数,但只是返回类型不同,我如何提高它们的代码重用?

kmbjn2e3  于 2023-03-13  发布在  Flutter
关注(0)|答案(2)|浏览(103)

我有两个不同的类,它们都是另一个基类的子类,每个类都有一个方法来返回一个对象,做同样的事情,但返回不同的类型,是否可以在基类中编写这个方法?

class base {}

class subclassOne extends base {
  subclassOne doSomething() {
    //doing some common things
    return subclassOne();
  }
}

class subclassTwo extends base {
  subclassTwo doSomething() {
    //doing some common things
    return subclassTwo();
  }
}

我试过了,但显然编译器是这么说的。runtimeType不是类型。

class base {
  base doSomething() {
    //doing some common things
    return base() as this.runtimeType;
  }
}

class subclassOne extends base {}

class subclassTwo extends base {}
ruyhziif

ruyhziif1#

最直接的方法是重构代码,以便共享公共工作:

abstract class Base {
  void doCommonThings() {
    // Do some common things.
  }

  Base doSomething();
}

class SubclassOne extends Base {
  @override
  SubclassOne doSomething() {
    doCommonThings();
    return SubclassOne();
  }
}

class SubclassTwo extends Base {
  @override
  SubclassTwo doSomething() {
    doCommonThings();
    return SubclassTwo();
  }
}

另一种方法是添加一个从现有示例返回新子类示例的方法(下面的代码使Base成为泛型,这样doSomething就静态地返回子类类型)。

abstract class Base<T extends Base<T>> {
  T doSomething() {
    // Do some common things.
    return copyWith();
  }

  T copyWith();
}

class SubclassOne extends Base<SubclassOne> {
  @override
  SubclassOne copyWith() => SubclassOne();
}

class SubclassTwo extends Base<SubclassTwo> {
  @override
  SubclassTwo copyWith() => SubclassTwo();
}

一个更通用的版本是让子类提供回调而不是方法重写:

abstract class Base {
  T doCommonThings<T extends Base>(T Function() makeInstance) {
    // Do some common things.
    return makeInstance();
  }

  Base doSomething();
}

class SubclassOne extends Base {
  @override
  SubclassOne doSomething() => doCommonThings(SubclassOne.new);
}

class SubclassTwo extends Base {
  @override
  SubclassTwo doSomething() => doCommonThings(SubclassTwo.new);
}
lztngnrs

lztngnrs2#

您可以使用泛型<T>来实现这一点

class Base<T> {
  T doSomething() {
    //doing some common things
    return this as T;
  }
}

class SubclassOne extends Base<SubclassOne> {}

class SubclassTwo extends Base<SubclassTwo> {}

相关问题