Created
January 24, 2020 13:12
-
-
Save AlexVegner/57555175d6c5b752b75aa15a09da19a9 to your computer and use it in GitHub Desktop.
dart_class.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
/// class | |
class Pesron { | |
String name; // field | |
int age; | |
String description() { | |
// method | |
return '$name, age: $age'; | |
} | |
} | |
/// User class extends Pesron | |
class User extends Pesron { | |
String email; | |
} | |
/// Class can inplement othr class or abstract class | |
class CommonUser implements Pesron { | |
String name; | |
int age; | |
String email; | |
@override | |
String description() { | |
// method | |
return '$name, age: $age, $email'; | |
} | |
} | |
/// Simple enum | |
enum Role { | |
admin, // Role.admin.index == 0 | |
client, // Role.client.index == 1 | |
guest, // Role.guest.index == 2 | |
} | |
/// Abstract class | |
abstract class GetRole { | |
List<Role> get roles; | |
set roles(List<Role> roles); | |
// metods can be used | |
} | |
// Multiple implementations of User | |
class ClientUser extends User implements GetRole { | |
List<Role> _roles = [Role.client]; | |
@override | |
List<Role> get roles => | |
_roles; // avoid to wrap fields to getters and settrrs just to be "safe" | |
@override | |
set roles(List<Role> roles) { | |
_roles = roles; | |
} | |
} | |
class AdminUser extends User implements GetRole { | |
@override | |
List<Role> roles = [Role.guest]; | |
} | |
class GuestUser extends User implements GetRole { | |
final String guestNotes; | |
GuestUser({name, email, age, this.guestNotes}) { | |
this.name = name; | |
this.email = email; | |
this.age = age; | |
} | |
@override | |
List<Role> roles = [Role.guest]; | |
} | |
class DefaultUser extends GuestUser { | |
/// Default constructor | |
DefaultUser({String name = 'Guest', String email: 'no', int age}) | |
: super(name: name, email: email, age: age); | |
/// named constructor | |
DefaultUser.withName(String name) : super(name: name); | |
/// factory | |
factory DefaultUser.name(String name) { | |
return DefaultUser(name: name); | |
} | |
} | |
/// Recomendation for models | |
/// Use final fields and named parameters in constructor | |
/// Protect your models from mutation | |
/// you could use @immutable, for meta package | |
class UserEntity { | |
final String name; | |
final int age; | |
final String email; | |
UserEntity({this.name, this.age, this.email}); | |
@override | |
String toString() { // reuse toString | |
return '$name, age: $age, $email'; | |
} | |
} | |
main() { | |
final u1 = User() | |
..name = 'Alex' // You could use cascade notation for mutable fields | |
..email = 'alex@gmail.com' | |
..age = 20; | |
print(u1.description()); | |
final guest = DefaultUser.name('Guest 1'); | |
print(guest.description()); | |
final userEntity = UserEntity( | |
name: 'Alex', | |
email: 'alex@gmail.com', | |
age: 20, | |
); | |
print(userEntity); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment