Last active
April 5, 2023 09:12
-
-
Save tvd12/569441f8f858ab08b54235434040ea62 to your computer and use it in GitHub Desktop.
Design Patterns
This file contains hidden or 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
| import 'dart:mirrors'; | |
| class A { | |
| late String a; | |
| A clone() { | |
| var instance = reflect(this); | |
| var newInstance = reflect(this).type.newInstance( | |
| Symbol.empty, | |
| [] | |
| ); | |
| ClassMirror? classMirror = reflectClass(runtimeType); | |
| while (classMirror != null) { | |
| var fields = classMirror.declarations.values.whereType<VariableMirror>(); | |
| for (var field in fields) { | |
| newInstance | |
| .setField( | |
| field.simpleName, | |
| instance | |
| .getField(field.simpleName) | |
| .reflectee | |
| ) | |
| .reflectee; | |
| } | |
| classMirror = classMirror.superclass; | |
| } | |
| return newInstance.reflectee as A; | |
| } | |
| } | |
| class B extends A { | |
| late String b; | |
| } | |
| class C extends A { | |
| late String c; | |
| @override | |
| String toString() { | |
| return "$a $c"; | |
| } | |
| } | |
| void main(List<String> arguments) { | |
| C c = C(); | |
| c.a = 'hello'; | |
| c.c = 'world'; | |
| print(c.clone()); | |
| } |
This file contains hidden or 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
| class A { | |
| late String a; | |
| } | |
| class B extends A { | |
| late String b; | |
| } | |
| class C extends A { | |
| late String c; | |
| @override | |
| String toString() { | |
| return "$a $c"; | |
| } | |
| } | |
| abstract class Copier<T> { | |
| T convert(T t) { | |
| T newT = newInstance(); | |
| setProperties(t, newT); | |
| return newT; | |
| } | |
| T newInstance(); | |
| void setProperties(T obj, T newObj); | |
| } | |
| class ACopier extends Copier<A> { | |
| @override | |
| A newInstance() { | |
| return A(); | |
| } | |
| @override | |
| void setProperties(A obj, A newObj) { | |
| newObj.a = obj.a; | |
| } | |
| } | |
| class BCopier extends ACopier { | |
| @override | |
| A newInstance() { | |
| return B(); | |
| } | |
| @override | |
| void setProperties(A obj, A newObj) { | |
| (newObj as B).b = (obj as B).b; | |
| super.setProperties(obj, newObj); | |
| } | |
| } | |
| class CCopier extends ACopier { | |
| @override | |
| A newInstance() { | |
| return C(); | |
| } | |
| @override | |
| void setProperties(A obj, A newObj) { | |
| (newObj as C).c = (obj as C).c; | |
| super.setProperties(obj, newObj); | |
| } | |
| } | |
| class Cloner { | |
| Map<Type, Copier> converters = { | |
| A: ACopier(), | |
| B: BCopier(), | |
| C: CCopier() | |
| }; | |
| T clone<T>(T value) { | |
| return converters[value.runtimeType]?.convert(value); | |
| } | |
| } | |
| void main(List<String> arguments) { | |
| Cloner cloner = Cloner(); | |
| C c = C(); | |
| c.a = "hello"; | |
| c.c = "world"; | |
| print(cloner.clone(c)); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment