// 定义Fillable trait作为Shape的supertrait
trait Fillable {
fn fill(&self);
}
trait Shape: Fillable {
fn draw(&self);
}
// 矩形结构体
struct Rectangle {
width: u32,
height: u32,
}
// 矩形实现Shape trait
impl Shape for Rectangle {
fn draw(&self) {
println!("Drawing a rectangle with width {} and height {}", self.width, self.height);
}
fn fill(&self) {
println!("Filling the rectangle with width {} and height {}", self.width, self.height);
}
}
// 圆形结构体
struct Circle {
radius: u32,
}
// 圆形实现Shape trait
impl Shape for Circle {
fn draw(&self) {
println!("Drawing a circle with radius {}", self.radius);
}
fn fill(&self) {
println!("Filling the circle with radius {}", self.radius);
}
}
代码复用性和扩展性解释
- 代码复用性:
- 通过将
Fillable
作为Shape
的supertrait,所有实现Shape
的结构体(如Rectangle
和Circle
)自动继承了Fillable
的功能。这避免了在每个具体图形结构体中重复实现填充操作的代码,提高了代码复用性。例如,Rectangle
和Circle
都不需要单独定义fill
方法的框架,直接按照Fillable
的要求实现具体逻辑即可。
- 扩展性:
- 当需要添加新的图形类型时,只要让新图形结构体实现
Shape
trait,就自动拥有了基本图形操作(draw
)和填充操作(fill
)的能力。例如,如果要添加一个Triangle
结构体,只需要实现Shape
trait,代码如下:
struct Triangle {
base: u32,
height: u32,
}
impl Shape for Triangle {
fn draw(&self) {
println!("Drawing a triangle with base {} and height {}", self.base, self.height);
}
fn fill(&self) {
println!("Filling the triangle with base {} and height {}", self.base, self.height);
}
}
- 这种设计方式使得代码结构清晰,新功能的添加对原有代码的影响较小,易于扩展整个图形绘制库的功能。