Nested class that inherits from its generic parent class

≡放荡痞女 提交于 2019-12-13 13:24:17

问题


is this possible to somehow, have this scenario, where A.N inherits code from A with this code example?

The reason for setting it up like this, is that I need multiple classes that inherit from Base<TType> and the Nested : Base<TType> where the server has the base only, and the client has the extended Nested. This way, it would be easy to use the code, where they would have some shared code between themselves & each other.

The problem is that I would have to write identical code inside the

A and A.N  
B and B.N  
C and C.N 

etc.

I have solved this temporarily, by replacing the Nested abstract class, with an Interface and doing
A.N : A, INested, but now I have to rewrite the Base<TType>.Nested code again inside all the Nested classes. For now, the nested class is small & managable.

hope this isn't a confusing question...

public abstract class Base<TType> where TType : class
{
    public TType data;
    internal void CommonCodeForAll() { }
    public abstract void Update();
    public abstract class Nested : Base<TType>
    {
        public abstract void Input();
    }
}

public class A : Base<someClass>
{
    public float Somevariable;

    public void SpecificFunctionToA() { }

    public override void Update()
    {
        // code that gets executed on server & client side that is unique to A
    }

    public class N : A.Nested
    {
        public override void Input()
        {
            if (data.IsReady()) { Somevariable *= 2; }
            SpecificFunctionToA();
        }
    }
}
public class B : Base<anotherClass>
{
    public float Somevariable;
    public int index;
    public int[] Grid;

    public void SomethingElse() { }

    public override void Update()
    {
        // code that gets executed on server & client side that is unique to B
    }

    public class N : B.Nested
    {
        public override void Input()
        {
            if (Grid[index] == -1) { SomethingElse(); }
            data.Somevariable = Grid[index];
        }
    }
}

Edit: I updated the code example to show what I'm trying to achieve.
Why I am trying to do this, is to keep the physics, networking & User input seperate. There are multiple different controllers where each one has their own pack & unpacking functions, controller identity & access to the physics engine.


回答1:


I have a solution using ecapsulation of classes instead of inheritance.

public abstract class BaseGeneric<T>
{
    T data;
    // ctor
    protected BaseGeneric(T data)
    {
        this.data=data;
    }
    // methods
    public abstract void Update();
    // properties
    public T Data
    {
        get { return data; }
        set { data=value; }
    }

    // base nested class
    public abstract class BaseNested<B> where B : BaseGeneric<T>
    {
        protected B @base;
        // ctor
        protected BaseNested(B @base)
        {
            this.@base=@base;
        }
        // methods
        public abstract void Input(T data);
        public void Update() { @base.Update(); }
        // properties
        public T Data
        {
            get { return @base.data; }
            set { @base.data=value; }
        }
    }
}

// implementation base
public class Base : BaseGeneric<int>
{
    // ctor
    protected Base(int data) : base(data) { }
    //methods
    public override void Update()
    {
        this.Data+=1;
    }
    // implemented nested class
    public class Nested : Base.BaseNested<Base>
    {
        // ctor
        public Nested(int data) : base(new Base(data)) { }
        public Nested(Base @base) : base(@base) { }
        // methods
        public override void Input(int data)
        {
            this.Data=data;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // new implemented class with value 0
        var nested=new Base.Nested(0);
        // set value to 100
        nested.Input(100);
        // call update as implemented by `Base`.
        nested.Update();
    }
}


来源:https://stackoverflow.com/questions/21566701/nested-class-that-inherits-from-its-generic-parent-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!