首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >战略模式

战略模式
EN

Code Review用户
提问于 2013-08-05 04:06:33
回答 1查看 2.2K关注 0票数 5

我正在研究"Head First Design Patterns“,我正试图将这些代码正确地转换为C#。这是我所拥有的。到目前为止,你能告诉我这是否是一个很好的实现/转换吗?

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Duck
{
    public abstract class Duck
    {
        public FlyBehavior flyBehavior;
        public QuackBehavior quackBehavior;
        public Duck(){

        }

        public abstract void display();

        public void performFly()
        {
            flyBehavior.fly();
        }

        public void performQuack()
        {
            quackBehavior.quack();
        }

        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 can't fly!");
        }
    }

    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 a real Mallard duck");
        }
    }

    public class MiniDuckSimulator
    {
        public static void Main(string[] args)
        {
            Duck mallard = new MallardDuck();
            mallard.performQuack();
            mallard.performFly();
            Console.ReadLine();
        }
    }
}
EN

回答 1

Code Review用户

发布于 2013-08-05 08:06:17

奇怪的是,在微软C#世界中,PascalCasing (相对于camelCasing)不仅适用于类,还适用于公共字段、公共方法和公共属性。

因此,您可能希望将Duck.flyBehavior重命名为Duck.FlyBehavior,将Duck.quackBehavior重命名为Duck.QuackBehavior,等等。

由于这些字段是公共字段,因此您可能需要将这些字段切换到C#属性,以防止需要添加清理输入的功能。

先于

public FlyBehavior FlyBahavior

在*

之后

public FlyBehavior FlyBehavior { get; set; }

虽然,我仍然以旧的方式编写C#,但是如果情况没有改变,我认为接口仍然以大写I作为前缀。所以您的FlyBehavior接口将被命名为IFlyBehavior。对于QuackBehavior来说,同样的事情;它将变成IQuackBehavior

另一个迂腐的评论:虽然我有预感你已经知道这一点,但类应该在自己的档案*。我只是说,万一我的预感是错的,而你不知道。

*免责声明:我不太清楚为什么把类分离成文件是很重要的。我并不是说这不重要,只是如果你想知道为什么,恐怕我只能给你我自己的直觉,为什么我认为把类分成自己的文件是很重要的。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/29384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档