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。但是,这将使您的代码更加通用。
我 运行 遇到了我最不喜欢的问题,那就是重写代码。这是我目前设计的结构。
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。但是,这将使您的代码更加通用。