我遇到了我最不喜欢的问题,那就是重写代码。这是我目前设计的结构。
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%
答案 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'来影响这个人。
再次希望这有帮助!
聚苯乙烯。仍然在平板电脑上的酒吧。请原谅错别字和缺少代码示例。