Skip to content

Instantly share code, notes, and snippets.

@AlexVegner
Created January 24, 2020 13:12
Show Gist options
  • Save AlexVegner/57555175d6c5b752b75aa15a09da19a9 to your computer and use it in GitHub Desktop.
Save AlexVegner/57555175d6c5b752b75aa15a09da19a9 to your computer and use it in GitHub Desktop.
dart_class.dart
/// 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