好的,所以我最近一直在加快类,继承,接口以及它们如何相互交互。在此期间,我发现了对各种论坛/博客/视频的继承和赞成作品的一般声音蔑视。好的,很酷的东西要学习。使用this wiki page上的例子,我开始尝试并更好地理解它......我迄今为止的成就似乎只会让我更加困惑。C#作文 - 我不确信我完全理解如何实现这个
我的代码,然后我会解释我认为是错误的。
MainClass.cs
class MainClass
{
static void Main(string[] args)
{
var player = new Player();
var enemy = new Enemy();
var entity = new Entity();
for(int i = 0; i < GameObject.GameObjects.Count; i++)
{
GameObject.GameObjects[i].Type();
GameObject.GameObjects[i].Draw();
GameObject.GameObjects[i].Move();
GameObject.GameObjects[i].Collision();
GameObject.GameObjects[i].Ai();
Console.WriteLine();
}
Console.ReadKey();
}
}
GameObject.cs
interface IVisible
{
void Draw();
}
class Visible : IVisible
{
public void Draw()
{
this.Print("I am visible!");
}
}
class Invisible : IVisible
{
public void Draw()
{
this.Print("I am invisible!");
}
}
interface IVelocity
{
void Move();
}
class Moving : IVelocity
{
public void Move()
{
this.Print("I am moving!");
}
}
class Stopped : IVelocity
{
public void Move()
{
this.Print("I am stopped!");
}
}
interface ICollidable
{
void Collide();
}
class Solid: ICollidable
{
public void Collide()
{
this.Print("I am solid!");
}
}
class NotSolid: ICollidable
{
public void Collide()
{
this.Print("I am not solid!");
}
}
interface IAi
{
void Ai();
}
class Aggressive : IAi
{
public void Ai()
{
this.Print("I am aggressive!");
}
}
class Passive : IAi
{
public void Ai()
{
this.Print("I am passive!");
}
}
class GameObject
{
private readonly IVisible _vis;
private readonly IVelocity _vel;
private readonly ICollidable _col;
private readonly IAi _ai;
public static List<GameObject> GameObjects = new List<GameObject>();
public GameObject(IVisible visible, IVelocity velocity)
{
_vis = visible;
_vel = velocity;
GameObjects.Add(this);
}
public GameObject(IVisible visible, IVelocity velocity, ICollidable collision)
{
_vis = visible;
_vel = velocity;
_col = collision;
GameObjects.Add(this);
}
public GameObject(IVisible visible, IVelocity velocity, ICollidable collision, IAi ai)
{
_vis = visible;
_vel = velocity;
_col = collision;
_ai = ai;
GameObjects.Add(this);
}
public void Draw()
{
if(_vis != null)
_vis.Draw();
}
public void Move()
{
if(_vel != null)
_vel.Move();
}
public void Collision()
{
if(_col != null)
_col.Collide();
}
internal void Ai()
{
if(_ai != null)
_ai.Ai();
}
}
class Player : GameObject
{
public Player() : base (new Visible(), new Stopped(), new Solid()) { }
}
class Enemy : GameObject
{
public Enemy() : base(new Visible(), new Stopped(), new Solid(), new Aggressive()) { }
}
class Entity : GameObject
{
public Entity() : base(new Visible(), new Stopped()) { }
}
Utilities.cs(会不会担心这一点 - 我发现了扩展方法而努力这也是如此)
public static class Utilities
{
public static void Type(this object o)
{
Console.WriteLine(o);
}
public static void Print(this object o, string s)
{
Console.WriteLine(s);
}
}
好的,我对基础示例所做的更改是将它从始终使用3个接口更改为使用基于该类的2-4。不过,我立即遇到了如何通过构图来实现这一点的问题。
我首先尝试了为每种类型制作不同类型的GameObject(GameObjectAI(),GameObjectEntity()等),但这似乎导致代码重复以及与继承有关的所有各种不可思议的问题 - 我不知道我是否在这里的正确轨道上,但创造了一个糟糕的非组成性实施。虽然如果是这样,那么我绝对不会理解有关作曲的内容,因为我不知道如何去做而不会产生这些问题。
然后我转移到当前的解决方案。虽然这看起来非常不雅。虽然它可以产生预期的输出,但这不是正确的 - 它有像Player()或Entity()这样的类获取它们不使用的接口,然后必须有!= null检查来停止运行时异常他们显然可以拥有相关的类。
所以,是的,有一些关于作文我觉得我现在没有得到。
谢谢!
至于一切;使用* moderation *中的模式。您已经正确识别出这非常详细,并且存在许多问题。如果你想要像伐木这样的东西,组成就派上用场了;一个可能由玩家类执行的任务,但不与玩家直接相关*。另一个例子可能是动画师;提供玩家的东西。而不是使用继承:'player:animator'和'monster:animator',你会为玩家和怪物提供一个动画实例。 – Rob