|
|
@ -0,0 +1,136 @@ |
|
|
|
import 'dart:math'; |
|
|
|
|
|
|
|
void basic_classes() { |
|
|
|
Square square = Square(10.0); |
|
|
|
Rectangle rectangle = Rectangle(20.0, 15.0); |
|
|
|
Circle circle = Circle(2.0); |
|
|
|
|
|
|
|
print(square.name); |
|
|
|
print(rectangle.name); |
|
|
|
print(circle.name); |
|
|
|
} |
|
|
|
|
|
|
|
abstract class Shape { |
|
|
|
double get perimeter; |
|
|
|
double get area; |
|
|
|
String get name; |
|
|
|
} |
|
|
|
|
|
|
|
class Circle extends Shape { |
|
|
|
double radius; |
|
|
|
|
|
|
|
Circle(this.radius); |
|
|
|
|
|
|
|
@override |
|
|
|
double get area => pi * (radius * radius); // πr² |
|
|
|
|
|
|
|
@override |
|
|
|
String get name => "I'm a circle with radius: $radius"; |
|
|
|
|
|
|
|
@override |
|
|
|
double get perimeter => 2 * pi; // 2πr |
|
|
|
|
|
|
|
@override |
|
|
|
String toString() => "${this.runtimeType}($radius)"; |
|
|
|
} |
|
|
|
|
|
|
|
class Rectangle extends Shape { |
|
|
|
double length; |
|
|
|
double width; |
|
|
|
|
|
|
|
Rectangle(this.length, this.width); |
|
|
|
|
|
|
|
@override |
|
|
|
double get area => length * width; |
|
|
|
|
|
|
|
@override |
|
|
|
String get name => "I'm a rectangle with length: $length, width: $width"; |
|
|
|
|
|
|
|
@override |
|
|
|
double get perimeter => 2 * (length + width); |
|
|
|
|
|
|
|
@override |
|
|
|
String toString() => "${this.runtimeType}($length, $width)"; |
|
|
|
} |
|
|
|
|
|
|
|
class Square extends Rectangle { |
|
|
|
Square(double side) : super(side, side); |
|
|
|
|
|
|
|
@override |
|
|
|
String get name => "I'm a square with side: $length"; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void basic_interfaces_and_mixins() { |
|
|
|
SmartPhone myPhone = SmartPhone("123-456-789"); |
|
|
|
SmartTablet myPad = SmartTablet("111-222-333"); |
|
|
|
|
|
|
|
try { |
|
|
|
myPhone.pickUp(); |
|
|
|
myPhone.dial("789-456-123"); |
|
|
|
myPad.pickUp(); |
|
|
|
myPad.dial("789-456-123"); |
|
|
|
} catch (e) { |
|
|
|
print(e); |
|
|
|
} |
|
|
|
|
|
|
|
print(myPhone.nowTime); |
|
|
|
myPhone.setAlarm(myPhone.nowTime.add(Duration(minutes: 20))); |
|
|
|
} |
|
|
|
|
|
|
|
mixin ClockMixin { |
|
|
|
DateTime nowTime = DateTime.now(); |
|
|
|
|
|
|
|
void setAlarm(DateTime alarmTime) { |
|
|
|
print("Set an alarm at $alarmTime"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// Interface Phone |
|
|
|
abstract class Phone { |
|
|
|
String get phoneNumber; |
|
|
|
|
|
|
|
void dial(String number) {} |
|
|
|
|
|
|
|
void pickUp() {} |
|
|
|
} |
|
|
|
|
|
|
|
class SmartPhone with ClockMixin implements Phone { |
|
|
|
String _phoneNumber; |
|
|
|
|
|
|
|
SmartPhone(String phoneNumber) : this._phoneNumber = phoneNumber; |
|
|
|
|
|
|
|
@override |
|
|
|
void dial(String number) { |
|
|
|
print("SmartPhone($phoneNumber) dials $number"); |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
String get phoneNumber => _phoneNumber; |
|
|
|
|
|
|
|
@override |
|
|
|
void pickUp() { |
|
|
|
print("Pick up SmartPhone($phoneNumber)"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
class SmartTablet with ClockMixin implements Phone { |
|
|
|
String _phoneNumber; |
|
|
|
|
|
|
|
SmartTablet(String phoneNumber) : this._phoneNumber = phoneNumber; |
|
|
|
|
|
|
|
@override |
|
|
|
void dial(String number) { |
|
|
|
throw UnimplementedError("SmartTablet can't dial"); |
|
|
|
} |
|
|
|
|
|
|
|
@override |
|
|
|
String get phoneNumber => _phoneNumber; |
|
|
|
|
|
|
|
@override |
|
|
|
void pickUp() { |
|
|
|
print("Pick up SmartTablet($phoneNumber)"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|