如何覆盖自定义库类中的方法

时间:2012-04-24 10:44:08

标签: c# oop namespaces override

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

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

内部GameObject是一种SetPosition()方法。

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

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

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

3 个答案:

答案 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
    }
}