我有两个项目:ClientProj
和ServerProj
,它们共享SharedLibrary
,其中包含我游戏的基础知识。
在这个库中,我有一个类GameObject
,它是许多其他游戏项继承的基类。
内部GameObject
是一种SetPosition()
方法。
这是我的问题:当我在客户端上运行SetPosition()
时,我希望添加一些额外的代码/完全覆盖该方法。我希望添加的代码与仅存在于ClientProj
命名空间中的类有关,SharedLibrary
对此一无所知。
是否有任何干净的方式来覆盖或扩展库方法?
更新:请注意,GameObject的实例以及继承它的所有内容都在SharedLibrary命名空间内定义,包含和处理。在大多数情况下,ClientProj和ServerProj只处理网络,用户和输入/输出。
答案 0 :(得分:3)
您可以使用Proxy pattern并让游戏对象继承自代理类而不是真正的类:
SharedLibrary:
public class GameObject
{
public virtual void SetPosition() { ... }
}
public class DelegatingGameObject : GameObject
{
public GameObject Inner;
public override void SetPosition() { Inner.SetPosition(); }
}
public class Tree : DelegatingGameObject
{
}
ClientLibrary:
class ClientGameObject : GameObject
{
public override void SetPosition()
{
if (isMonday) base.SetPosition();
}
}
var tree = new Tree { Inner = new ClientGameObject() };
tree.SetPosition();
SharedLibrary:
public class GameObject
{
public virtual void SetPosition() { Console.WriteLine("GameObject.SetPosition"); }
public static event Func<GameObject> Factory;
internal static GameObject CreateBase() { var factory = Factory; return (factory != null) ? factory() : new GameObject(); }
}
internal class GameObjectBase : GameObject
{
private readonly GameObject baseGameObject;
protected GameObjectBase() { baseGameObject = GameObject.CreateBase(); }
public override void SetPosition() { baseGameObject.SetPosition(); }
}
internal class Tree : GameObjectBase
{
public override void SetPosition()
{
Console.WriteLine("Tree.SetPosition");
base.SetPosition();
}
}
public static class Game
{
public static void Start()
{
new Tree().SetPosition();
}
}
ClientLibrary:
internal class ClientGameObject : GameObject
{
public override void SetPosition()
{
Console.WriteLine("ClientGameObject.SetPosition Before");
base.SetPosition();
Console.WriteLine("ClientGameObject.SetPosition After");
}
}
internal static class Program
{
static void Main(string[] args)
{
GameObject.Factory += () => new ClientGameObject();
Game.Start();
}
}
答案 1 :(得分:1)
使SetPosition方法成为虚拟,并使用override关键字覆盖其在ClientProj中的行为。
答案 2 :(得分:1)
您可以在基类中执行virtual
,在derived
中覆盖,在重写方法中调用您的方法并在base
类方法之后执行。
伪代码可能如下所示:
public class GameObject
{
public virtual void SetPosition()
{
//do something here
}
}
public class Derived: GameObject
{
public override void SetPosition()
{
// do something specific to Derived
base.SetPosition(); // CALL BASE CLASS METHOD AFTER
}
}