接口/抽象的体系结构

时间:2015-03-18 19:08:57

标签: c# .net interface abstract-class

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

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);
    }
}

这里的问题是多个类以相同的方式使用接口。但他们并不总是以同样的方式做到这一点。有没有办法实现这个..更正确。我有另一个选项是一个抽象类,可以用于这个例子,但是当我有更多的接口时(ICanAttack,ICanBuild)

使用抽象类

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

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

    public void Run()
    { 

    }
}

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

3 个答案:

答案 0 :(得分:1)

(在pub atm的平板电脑上,请原谅错别字和缺少代码示例)

嗯,这个比喻可以沿着超级英雄的路线运行:它们都有许多特殊的能力,但都是随意的和不同的。外部事件将这些能力“赋予”他们(彼得帕克可以爬墙,因为他被蜘蛛咬伤)。

所以,你的类结构可能是你有一个iHasAbility接口,它实现了一个iAbility列表。你可以通过'Bestow(责任)'方法赋予这些能力,然后有一些方法来制定这些能力......'Enact(“climbwall”)'。

所以......构成而不是抽象。能力变得抽象而不是主题。

希望这有助于甚至只是引发思考。

答案 1 :(得分:1)

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

你的Walk / Run应该是移动界面。

例如,你可能有一个只能"滚动"而不是跑步/走路。所以机器人的运动应该是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和Flying的战略模式。此页面也是本书的一部分。 Duck example strategy pattern - Head first design pattern

例如:

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);
}

抱歉,我正在通过手机播放电话。但是,这将为您的代码提供更多功能。

答案 2 :(得分:0)

另一种方法可能是使用辅助类(前几天我使用Michael knight和kitt读了一个很棒的例子。对它进行了修改。)

所以你有一个课程(Iperson),可以通过实现“影响(Iperson)”之类的任意类来帮助。

'warriorhelper'帮助者可以通过'strikefoe'和'buildhome'来影响这个人。

再次希望这有帮助!

聚苯乙烯。仍然在平板电脑上的酒吧。请原谅错别字和缺少代码示例。