1

我有两个项目:ClientProjServerProj,它们都共享一个SharedLibrary包含我的游戏基础知识的项目。

在这个库中,我有一个类GameObject,它是许多其他游戏项目继承的基类。

里面GameObject是一个SetPosition()方法。

这是我的问题:当我SetPosition()在客户端上运行时,我希望添加一些额外的代码/完全覆盖该方法。然而,我希望添加的代码与仅存在于ClientProj命名空间中的类有关,对此SharedLibrary一无所知。

是否有任何干净的方法来覆盖或扩展库方法?

更新:请注意,GameObject 的实例和继承它的所有事物都在 SharedLibrary 命名空间中定义、包含和处理。大多数情况下,ClientProj 和 ServerProj 只处理网络、用户和输入/输出。

4

3 回答 3

3

您可以使用代理模式并让游戏对象从代理类而不是真实类继承:

共享库:

public class GameObject
{
    public virtual void SetPosition() { ... }
}

public class DelegatingGameObject : GameObject
{
    public GameObject Inner;
    public override void SetPosition() { Inner.SetPosition(); }
}

public class Tree : DelegatingGameObject
{
}

客户图书馆:

class ClientGameObject : GameObject
{
    public override void SetPosition()
    {
        if (isMonday) base.SetPosition();
    }
}

var tree = new Tree { Inner = new ClientGameObject() };
tree.SetPosition();

共享库:

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

客户图书馆:

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();
    }
}
于 2012-04-24T10:53:06.457 回答
1

将 SetPosition 方法设为虚拟并使用 override 关键字覆盖其在 ClientProj 中的行为。

于 2012-04-24T10:47:16.953 回答
1

您可以virtual在基类中执行此操作,覆盖 in 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
    }
}
于 2012-04-24T10:47:28.913 回答