新建项目-〉VISUALC#-〉Windows-〉空项目
下面的写法应该是很不科学
这里我们只是为了便于理解
using System;
using System.Collections.Generic;
using System.Text;
namespace Project1
{
class Head_First
{
public abstract class Duck
{
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior; //接口定义的两个变量
public Duck()
{
}
public abstract void display(); //抽象方法,继承里面必须用override重写
public void performFly() //两个方法
{
flyBehavior.fly();
}
public void performQuack()
{
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior fb) //在鸭子子类中通
//过“设定方法(setter method)”来设定鸭子的行为,而不是在鸭子的构造器内实例化
{
flyBehavior = fb;
}
public void swim()
{
Console.WriteLine("All ducks float, even decoys!");
}
}
public interface FlyBehavior //接口
{
void fly();
}
public class FlyWithWings : FlyBehavior //继承接口
{
public void fly()
{
Console.WriteLine("I'm flying!");
}
}
public class FlyNoWay : FlyBehavior
{
public void fly()
{
Console.WriteLine("I'm not flying!");
}
}
public class FlyRocketPowered : FlyBehavior //定义新的方法
{
public void fly()
{
Console.WriteLine("I'm flying with a rocket");
}
}
public interface QuackBehavior
{
void quack();
}
public class Quack : QuackBehavior
{
public void quack()
{
Console.WriteLine("Quack");
}
}
public class MuteQuack : QuackBehavior
{
public void quack()
{
Console.WriteLine("<<Silence>>");
}
}
public class Squeak : QuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak");
}
}
public class MallardDuck : Duck
{
public MallardDuck()
{
quackBehavior = new Quack(); //用类实现接口
flyBehavior = new FlyWithWings();
}
public override void display()
{
Console.WriteLine("I'm real Mallard duck");
}
}
public class ModelDuck : Duck
{
public ModelDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyNoWay();
}
public override void display()
{
Console.WriteLine("I'm real Model Duck");
}
}
static void Main(string[] args)
{
// Duck mallard = new MallardDuck();
// mallard.performQuack(); //在Duck里面写好的方法,在MallardDuck用接口实现
// mallard.performFly();
// mallard.display();
// Console.ReadLine();
Duck modelduck =new ModelDuck();
modelduck.performQuack();
modelduck.performFly();
modelduck.setFlyBehavior(new FlyRocketPowered());
modelduck.performFly();
Console.ReadLine();
}
}
}