面向对象编程
项目链接:GitHub
概述
MaìLang 支持完整的面向对象编程范式,包括:
- 类与继承
- 接口(Trait)
- 封装
- 多态
类
基本类定义
class Animal {
// 属性
let name: str
let age: int
// 构造函数
fn init(name: str, age: int) {
this.name = name
this.age = age
}
// 方法
fn speak() -> str {
return "{this.name} 发出声音"
}
fn info() -> str {
return "{this.name}, {this.age}岁"
}
}
// 创建实例
let cat = Animal("小花", 3)
println(cat.speak()) // 小花 发出声音
println(cat.info()) // 小花, 3岁属性访问
let dog = Animal("小黑", 2)
println(dog.name) // 小黑
println(dog.age) // 2
// 修改属性(需要 var)
var animal = Animal("小白", 1)
animal.name = "大白"继承
基本继承
class Dog extends Animal {
let breed: str
fn init(name: str, age: int, breed: str) {
super(name, age) // 调用父类构造函数
this.breed = breed
}
// 方法重写
override fn speak() -> str {
return "{this.name} 汪汪叫!"
}
// 子类特有方法
fn fetch() -> str {
return "{this.name} 去捡球"
}
}
let dog = Dog("小黑", 3, "拉布拉多")
println(dog.speak()) // 小黑 汪汪叫!
println(dog.fetch()) // 小黑 去捡球
println(dog.info()) // 继承自 Animal: 小黑, 3岁多层继承
class Puppy extends Dog {
fn init(name: str, breed: str) {
super(name, 0, breed) // 小狗年龄为0
}
override fn speak() -> str {
return "{this.name} 嗷呜~"
}
}
let puppy = Puppy("豆豆", "柴犬")
println(puppy.speak()) // 豆豆 嗷呜~Trait(接口)
定义 Trait
trait Printable {
// 必须实现的方法
fn to_string() -> str
// 默认实现
fn print() {
println(this.to_string())
}
fn debug() -> str {
return "Printable: {this.to_string()}"
}
}实现 Trait
class Point implements Printable {
let x: float
let y: float
fn init(x: float, y: float) {
this.x = x
this.y = y
}
fn to_string() -> str {
return "({this.x}, {this.y})"
}
}
let p = Point(3.0, 4.0)
p.print() // (3, 4)
println(p.debug()) // Printable: (3, 4)多 Trait 实现
trait Serializable {
fn serialize() -> str
}
trait Deserializable {
fn deserialize(data: str) -> Self
}
class Config implements Printable, Serializable {
let name: str
let value: str
fn init(name: str, value: str) {
this.name = name
this.value = value
}
fn to_string() -> str {
return "{this.name}={this.value}"
}
fn serialize() -> str {
return "{this.name}:{this.value}"
}
}封装
公有与私有
尚未支持 访问修饰符(
pub/priv/static均不被解析器接受)。当前所有属性和方法都是公有的,用命名约定(如_前缀)表达内部接口:
class BankAccount {
let owner: str
var _balance: float
fn init(owner: str, initial: float) {
this.owner = owner
this._balance = initial
}
fn deposit(amount: float) {
if amount > 0 {
this._balance += amount
}
}
fn withdraw(amount: float) -> bool {
if amount > 0 && amount <= this._balance {
this._balance -= amount
return true
}
return false
}
fn get_balance() -> float {
return this._balance
}
}
let account = BankAccount("张三", 1000.0)
account.deposit(500.0)
println(account.get_balance()) // 1500.0静态成员
尚未支持
static关键字。当前用模块级函数 / 常量替代:
const PI = 3.14159
fn square(x: int) -> int {
return x * x
}
fn circle_area(radius: float) -> float {
return PI * radius * radius
}
let area = circle_area(5.0)
let sq = square(4)高级特性
抽象类
尚未支持
abstract关键字。当前用 trait 声明必需方法,由类implements:
trait Shape {
fn area() -> float
fn perimeter() -> float
fn describe() -> str {
return "面积: {this.area()}, 周长: {this.perimeter()}"
}
}
class Circle implements Shape {
let radius: float
fn init(radius: float) {
this.radius = radius
}
fn area() -> float {
return 3.14159 * this.radius * this.radius
}
fn perimeter() -> float {
return 2 * 3.14159 * this.radius
}
}接口继承
trait ... extends ...已支持:子 trait 继承父 trait 的必需方法与默认实现。
trait Shape {
fn area() -> float
}
trait Transformable extends Shape {
fn scale(factor: float)
fn translate(dx: float, dy: float)
}
class TransformableShape implements Transformable {
// 实现 Transformable 即需覆盖 Shape 与 Transformable 的所有必需方法
}也可分别 implements 多个 trait。
设计模式
工厂模式
trait Animal {
fn speak() -> str
}
class Dog implements Animal {
fn speak() -> str { return "汪" }
}
class Cat implements Animal {
fn speak() -> str { return "喵" }
}
fn create_animal(type: str) -> Animal {
return match type {
"dog" => Dog(),
"cat" => Cat(),
_ => Err("未知动物类型")
}
}观察者模式
trait Observer {
fn update(message: str)
}
class EventManager {
var listeners: [Observer]
fn subscribe(listener: Observer) {
this.listeners.push(listener)
}
fn notify(message: str) {
for listener in this.listeners {
listener.update(message)
}
}
}最佳实践
- 单一职责:每个类应该只有一个职责
- 封装:隐藏内部实现细节
- 组合优于继承:优先使用组合而非深层继承
- 接口隔离:接口应该小而专注
- 多态:通过 trait 实现多态行为