Interface/Abstraction 的架构

Architecture for Interface/Abstraction

我 运行 遇到了我最不喜欢的问题,那就是重写代码。这是我目前设计的结构。

public interface ICanMove
{
    int speed { get; set; }

    void Walk();
    void Run();
}

public class Worker : ICanMove
{
    speed = 5;

    public void Walk()
    {
    //Example code Move(speed);
    }
}

public class Warrior : ICanMove
{
    speed = 3;

    public void Walk()
    {
    //Example code Move(speed);
    }
}

这里的问题是多个 class 以相同的方式使用界面。但他们不会总是以同样的方式去做。有没有办法更正确地实现这一点。我的另一个选择是一个抽象 class ,它适用于这个例子,但当我有更多的接口(ICanAttack,ICanBuild)时就不行

有摘要class

public abstract class LivingCreature : ICanMove
{
    public abstract int speed {get;set;}

    public void Walk()
    {
       //Example code Move(speed);
    }

    public void Run()
    { 

    }
}

但后来我的问题变成了我必须在一个基 class 上实现多个接口,并不是每个从该基 class 继承的对象都需要 100%

(在酒吧 atm 的平板电脑上,请原谅拼写错误和缺少代码示例)

好吧,这个类比可以 运行 类似于超级英雄:他们都有许多特殊能力,但都是任意且不同的。这些能力是 "bestowed" 由外部事件赋予他们的(彼得·帕克可以爬墙,因为他被蜘蛛咬了)。

因此,您的 class 结构可能是这样的,您有一个实现 iAbility 列表的 iHasAbility 接口。您可以通过 'Bestow(liability)' 方法赋予这些能力,然后通过某种方式来实施这些能力... 'Enact("climbwall")'.

所以...组合而不是抽象。能力变得抽象而不是主题。

希望这会有所帮助,甚至只是激发一个想法。

另一种方法可能是使用助手 classes(前几天我读了一个使用 Michael knight 和 kitt 的很好的例子。成功了)。

所以你有一个 class (Iperson) 可以通过实现类似 'influence(Iperson)'.

的任意 classes 来帮助

'warriorhelper' 帮助者可以通过 'strikefoe' 影响人,通过 'buildhome' 影响建造者帮助者。

再说一遍,希望对您有所帮助!

Ps。仍在平板电脑上的酒吧。请原谅拼写错误和缺少代码示例。

我建议遵循此方法的策略模式。

你Walk/Run应该是移动的接口。

例如,您可能有一个只能 "roll" 而不能 run/walk 的机器人。所以那个机器人的动作应该是Roll.

本书的第一章将帮助您根据当前的代码示例理解此模式。

http://www.amazon.ca/Head-First-Design-Patterns-Freeman/dp/0596007124(这是在 Java 中,但很容易翻译成 C#)这本书在许多网站上也是免费的。

在线版(免费):http://www.dcc.ufrj.br/~comp2/TextosJava/Head%20First%20-%20Design%20Patterns.pdf

这个 SO 问题还讨论了 Ducks and Flying 的策略模式。此页也是本书的一部分。

例如:

public interface IMovement
{
    int speed { get; set; }
}

public class Worker
{
    speed = 5;
    IMovement Movement;
   public Warrior(IMovement m)
    {
        this.Movement = m;
    }
    public void Move()
    {
      this.Movement.Move();
    }
}

public class Warrior
{
    speed = 3;
    IMovement movement;

    public Warrior(IMovement m)
    {
        this.Movement = m;
    }

    public void Move()
    {
      this.Movement.Move();
    }
}

void foo()
{
     IMovement m = new FlyingMovement();
     Worker w = new Worker(m);

    IMovement swimmingMovement = new SwimmingMovement();
     SwimmingWorker sw = new SwimmingWorker (swimmingMovement);
}

抱歉,我正在使用 phone atm。但是,这将使您的代码更加通用。