trait Beverage{
fn get_cost(&self)->u32;
fn get_description(&self)->String;
}

struct HouseBlend{

}
impl Beverage for HouseBlend {
// add code here
fn get_cost(&self)->u32{
return 3000;
}
fn get_description(&self)->String{
return String::from("House Blend");
}
}

struct Milk{
beverage:Box<Beverage>,
}
impl Beverage for Milk {
// add code here
fn get_cost(&self)->u32{
return self.beverage.get_cost() + 500;
}
fn get_description(&self)->String{
return self.beverage.get_description() + ", 우유";
}
}
impl Milk{
fn new(beverage:Box<Beverage>)->Milk{
return Milk{beverage:beverage};
}
}

struct Whip{
beverage:Box<Beverage>,
}
impl Beverage for Whip {
// add code here
fn get_cost(&self)->u32{
return self.beverage.get_cost() + 500;
}
fn get_description(&self)->String{
return self.beverage.get_description() + ", 휘프";
}
}
impl Whip{
fn new(beverage:Box<Beverage>)->Whip{
return Whip{beverage:beverage};
}
}
struct Soy{
beverage:Box<Beverage>,
}
impl Beverage for Soy {
// add code here
fn get_cost(&self)->u32{
return self.beverage.get_cost() + 1500;
}
fn get_description(&self)->String{
return self.beverage.get_description() + ", 원두";
}
}
impl Soy{
fn new(beverage:Box<Beverage>)->Whip{
return Whip{beverage:beverage};
}
}
struct Mocha{
beverage:Box<Beverage>,
}
impl Beverage for Mocha {
// add code here
fn get_cost(&self)->u32{
return self.beverage.get_cost() + 1500;
}
fn get_description(&self)->String{
return self.beverage.get_description() + ", 모카";
}
}
impl Mocha{
fn new(beverage:Box<Beverage>)->Whip{
return Whip{beverage:beverage};
}
}
fn main() {
let mut coffee:Box<Beverage> = Box::new(HouseBlend{});
println!("{}: {}원입니다.",coffee.get_description(), coffee.get_cost());
coffee = Box::new(Whip::new(coffee));
println!("{}: {}원입니다.",coffee.get_description(), coffee.get_cost());
coffee = Box::new(Mocha::new(coffee));
println!("{}: {}원입니다.",coffee.get_description(), coffee.get_cost());
coffee = Box::new(Milk::new(coffee));
println!("{}: {}원입니다.",coffee.get_description(), coffee.get_cost());
}

헤드퍼스트에 있는 예제를 변형해봄.