私はStartegyでHead First Duckの問題を実装しようとしました。私はデコイダックを実装しようとしています。デコイダックは、クワックやフライの施設がないため、デフォルトのコンストラクタを呼び出すことによって実装されています(このダックにはFlyまたはQuackの機能がありません)。他のすべてのダックは、オーバーライドされたコンストラクタを呼び出すことによって初期化されます。本では、Flyがないアヒルは、IFlyインターフェイスを実装するFlyNoFlyクラスで実装されています。これは正しい戦略の実装です
私のソリューションでは、私はこのクラスを使用していません。代わりに、私は基本的なアヒルのクラスをチェックしていますか?有効なインスタンスが渡されたかどうか(if(Fly!= null))。Flyに有効な参照がある場合は、その。私は、デフォルトのメッセージを投げていそうで。
私は私の実装では、これが有効な実装であるかどうかは任意の設計原理を/違反しているかどうかを知りたい。
おかげ TutuMon
public abstract class Duck
{
public IFlyable Fly { get; set; }
public IQuackable Quack { get; set; }
public void PerformQuack()
{
//Is this checking valid as per OO?
if (Quack != null)
Quack.Quack();
else
Console.WriteLine("Quack Operation Not supported");
}
public void PerformFly()
{
//Is this checking valid as per OO?
if (Fly != null)
Fly.Fly();
else
Console.WriteLine("Fly Operation not supported");
}
public abstract void Swim();
}
public class MallardDuck : Duck
{
public MallardDuck()
{
}
public MallardDuck(IFlyable fly, IQuackable quack)
{
Fly = fly;
Quack = quack;
}
public override void Swim()
{
Console.WriteLine("Mallard Duck is Swimming");
}
}
//No Fly and Quack behaviour by default
public class DecoyDuck : Duck
{
public DecoyDuck()
{
}
public DecoyDuck(IFlyable fly, IQuackable quack)
{
Fly = fly;
Quack = quack;
}
public override void Swim()
{
Console.WriteLine("DecoyDuck Duck is Swimming");
}
}
public interface IFlyable
{
void Fly();
}
public class FlyWithWings : IFlyable
{
public void Fly()
{
Console.WriteLine("You are flying with wings");
}
}
public class RocketFly : IFlyable
{
public void Fly()
{
Console.WriteLine("Rocket Powered Fly");
}
}
public interface IQuackable
{
void Quack();
}
public class RealQUack :IQuackable
{
public void Quack()
{
Console.WriteLine("This is Real Quack");
}
}
public class PowerQuack : IQuackable
{
public void Quack()
{
Console.WriteLine("Powerful Quacking ");
}
}
public class Program
{
public static void Main(string[] args)
{
Duck mallard = new MallardDuck
{Fly=new FlyWithWings(),Quack=new RealQUack()}
mallard.PerformQuack();
mallard.PerformFly();
// He can't Quack or Fly by default
// So i am calling the default constructor.
Duck decoy = new DecoyDuck();
decoy.PerformQuack();
decoy.PerformFly();
// Adding behaviours on the fly
decoy.Fly = new RocketFly();
decoy.Quack = new PowerQuack();
decoy.PerformQuack();
decoy.PerformFly();
Console.Read();
}
}
私はStackExchangeサイト[コードレビュー](http://codereview.stackexchange.com)がこの種の質問に適していると思います。 –