class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print('Hello, my name is $name');
}
}
void main() {
var p = Person('Tom', 30);
p.sayHello();
}
7️⃣ 继承与多态
class Animal {
void makeSound() => print('Animal sound');
}
class Dog extends Animal {
@override
void makeSound() => print('Woof!');
}
void main() {
Animal a = Dog();
a.makeSound(); // Woof!
}
class Person {
String name; // 属性
int age;
// 构造函数
Person(this.name, this.age);
// 方法
void sayHello() {
print('Hi, I am $name and I am $age years old.');
}
}
void main() {
var p = Person('Alice', 25);
p.sayHello();
}
class 关键字定义类。
类中可以包含:属性(字段) 构造函数 方法
实例化类用 var p = Person(…)。
2️⃣ 构造函数详解
class Dog {
String name;
Dog(this.name); // 简写,等价于 Dog(String name) { this.name = name; }
}
void main() {
var dog = Dog('Buddy');
print(dog.name);
}
命名构造函数
class Point {
int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0; // 命名构造函数
Point.fromList(List<int> coords)
: x = coords[0],
y = coords[1];
}
void main() {
var p1 = Point(2, 3);
var p2 = Point.origin();
var p3 = Point.fromList([5, 6]);
print('${p1.x}, ${p1.y}');
print('${p2.x}, ${p2.y}');
print('${p3.x}, ${p3.y}');
}
3️⃣ 继承、重写(Override)
class Animal {
void speak() {
print('Animal speaks');
}
}
class Dog extends Animal {
@override
void speak() {
print('Woof!');
}
}
void main() {
var a = Animal();
var d = Dog();
a.speak();
d.speak();
}
4️⃣ Getter & Setter
class Circle {
double _radius;
Circle(this._radius);
double get area => 3.14 * _radius * _radius;
set radius(double r) {
if (r > 0) {
_radius = r;
}
}
}
void main() {
var c = Circle(5);
print(c.area);
c.radius = 10;
print(c.area);
}
5️⃣ 抽象类(abstract class)
abstract class Shape {
double area();
}
class Rectangle extends Shape {
double width, height;
Rectangle(this.width, this.height);
@override
double area() => width * height;
}
void main() {
var r = Rectangle(10, 5);
print(r.area());
}
6️⃣ 接口(interface)和多重继承(Dart 没有真正的多继承)
Dart 中所有类都是隐式接口。
class Flyable {
void fly() => print('Flying');
}
class Swimmable {
void swim() => print('Swimming');
}
class Duck implements Flyable, Swimmable {
@override
void fly() => print('Duck is flying');
@override
void swim() => print('Duck is swimming');
}
void main() {
var d = Duck();
d.fly();
d.swim();
}
7️⃣ 静态成员 (static)
class MathUtils {
static double pi = 3.14159;
static double square(double x) => x * x;
}
void main() {
print(MathUtils.pi);
print(MathUtils.square(4));
}
8️⃣ 工厂构造函数(factory constructor)
class Logger {
static final Map<String, Logger> _cache = {};
final String name;
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
Logger._internal(this.name);
void log(String msg) {
print('[$name]: $msg');
}
}
void main() {
var l1 = Logger('App');
var l2 = Logger('App');
print(identical(l1, l2)); // true
l1.log('Hello');
}
class Person {
String name;
int _age;
Person(this.name, int age) : _age = age;
void sayHello() => print('Hi, I am $name');
int get age => _age;
set age(int a) {
if (a > 0) _age = a;
}
static String species = 'Human';
static void printSpecies() => print('Species: $species');
}
void main() {
var p = Person('Tom', 30);
p.sayHello();
print('Age: ${p.age}');
p.age = 35;
print('New Age: ${p.age}');
Person.printSpecies();
}