gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:52:49 30 4
gpt4 key购买 nike

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

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

GameObjectSetPosition()方法。

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

有没有干净的方法来覆盖或扩展库方法?

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

最佳答案

您可以使用 Proxy pattern并让游戏对象从代理类而不是真正的类继承:

共享库:

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

关于c# - 如何覆盖自定义库类中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10296340/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com