Last active
April 26, 2022 16:04
-
-
Save evaisse/660a4ec4fcb91ff648a632705ea4697a to your computer and use it in GitHub Desktop.
Describe how to implement a twin generics inheritance with dart
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
/// | |
/// @see https://dartpad.dev/660a4ec4fcb91ff648a632705ea4697a | |
/// | |
import 'package:flutter_test/flutter_test.dart'; | |
/// base controller, just to explain the main inheritance | |
class BaseController {} | |
class BaseScreen<T extends BaseController> { | |
late final T controller; | |
BaseScreen(this.controller); | |
String get name => runtimeType.toString(); | |
} | |
/// Intermediate abstract [AbstractIntermediateController] | |
/// which extends a common base controller | |
abstract class AbstractIntermediateController extends BaseController {} | |
abstract class AbstractIntermediateScreen<T extends AbstractIntermediateController> extends BaseScreen<T> { | |
AbstractIntermediateScreen(T controller) : super(controller); | |
} | |
/// Specialized late controller | |
class FirstController extends AbstractIntermediateController { | |
String sayFirst() => '1'; | |
} | |
class FirstScreen<T extends FirstController> extends AbstractIntermediateScreen<T> { | |
FirstScreen(T controller) : super(controller); | |
} | |
/// Specialized late controller | |
class SecondController extends AbstractIntermediateController { | |
String saySecond() => '2'; | |
} | |
class SecondScreen<T extends SecondController> extends AbstractIntermediateScreen<T> { | |
SecondScreen(T controller) : super(controller); | |
} | |
void main() { | |
test('test inheritance', () { | |
var first = FirstScreen(FirstController()); | |
first.controller.sayFirst(); | |
var second = SecondScreen(SecondController()); | |
second.controller.saySecond(); | |
expect('FirstScreen<FirstController> + SecondScreen<SecondController>', '${first.name} + ${second.name}'); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment