Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口/抽象的体系结构_C#_.net_Interface_Abstract Class - Fatal编程技术网

C# 接口/抽象的体系结构

C# 接口/抽象的体系结构,c#,.net,interface,abstract-class,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

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

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);
    }
}
这里的问题是多个类以相同的方式使用接口。但他们不会总是这样做。有没有办法更正确地实现这一点。我的另一个选择是一个抽象类,它适用于本例,但当我有更多接口时(ICANATCH、ICANBILD)

抽象类

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

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

    public void Run()
    { 

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

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

好吧,这个比喻可以用超级英雄来比喻:他们都有一些特殊的能力,但都是武断和不同的。这些能力是由外部事件“赋予”给他们的(彼得·帕克可以爬墙,因为他被蜘蛛咬了)

因此,您的类结构可以是这样的,即您有一个iHasAbility接口,该接口实现了一个iHasAbility列表。你可以通过“赋予(责任)”的方法赋予这些能力,然后有一些方法来实施这些能力制定(“攀登墙”)

所以。。。合成而不是抽象。这些能力变得抽象而不是主题


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

另一种方法可能是使用helper类(前几天我读了一个使用Michael knight和kitt的很好的例子。搞定了)

因此,您有一个类(Iperson),可以通过实现类似“影响(Iperson)”的任意类来帮助您

“战士”助手可以通过“罢工”影响该人,而建筑助手可以通过“建筑之家”影响该人

再次,希望这有帮助


还有,还在酒吧的平板电脑上。请原谅打字错误和缺少代码示例。

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

你的步行/跑步应该是运动的接口

例如,您可能有一个只能“滚动”而不能跑/走的机器人。所以机器人的动作应该是滚动的

下一本书的第一章将帮助您了解与当前代码示例相关的这种模式

(这是用Java编写的,但很容易翻译成C。)这本书也在许多网站上免费在线

网上版本(免费):

这个问题也谈到了鸭子和飞行的战略模式。这一页也是本书的一部分

例如:

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

对不起,我在自动取款机上。但是,这将为您的代码提供更多的通用性。

如果您不希望他们以不同的方式实现它,那么您可以使用您提到的抽象类。为了进一步扩展我的评论,接口可以保证您可以做一些事情,但不能保证您如何做。抽象类提供公共共享功能。您可以创建一个实现接口的抽象类,然后从抽象类继承。如果您创建一个抽象类,例如
BaseMover
,则可以让抽象类实现ICanMove,然后让Worker和Warrior从IBaseMover派生。问题是您不能执行多重继承,因此拥有BaseMover意味着您也可以继承标准化IcanBuild接口实现的BaseBuilder。也许您的
ICanMove
没有walk和run,而是只有walk和run所需的属性(因此这里只需加快速度)。然后创建一个mover类,该类实现Walk和Run,其中每个方法都包含一个move对象。如果你需要以不同的方式移动,那么你可以创建一个iOver界面,然后创建不同的步行/跑步组合:)我通常会等24小时才开始。就为了你,我会:)