Arachin
Arachin

Reputation: 107

How to override a method in a custom library class

I have two projects: ClientProj and ServerProj, which both share a SharedLibrary containing the basics of my game.

Inside this library I have the class GameObject which is the base class from which many other game items inherit.

Inside GameObject is a SetPosition() method.

Here's my problem: When I run SetPosition() on the client, I wish to add some additional code / override the method completely. The code I wish to add however relates to classes that are only present in the ClientProj namespace, which the SharedLibrary knows nothing about.

Is there any clean way to override or extend the library methods?

Updated: Note that the instances of GameObject and all things that inherit it are defined, contained and handled all within the SharedLibrary namespace. For the most part the ClientProj and ServerProj only handle networking, users and input/output.

Upvotes: 1

Views: 5325

Answers (3)

dtb
dtb

Reputation: 217341

You can use the Proxy pattern and have the game objects inherit from the proxy class instead of the real class:

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

Upvotes: 3

Tigran
Tigran

Reputation: 62276

You can do it virtual in base class, override in derived, and in overriden method call your methods and after base class method.

A psudocode can look like this:

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

Upvotes: 1

Mert Akcakaya
Mert Akcakaya

Reputation: 3149

Make SetPosition method virtual and use override keyword to override its behaviour in ClientProj.

Upvotes: 1

Related Questions