ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 从其通用父类继承的嵌套类

2019-07-08 22:08:12  阅读:196  来源: 互联网

标签:c visual-studio-2010 inheritance nested-class generics


这有可能以某种方式,这个场景,A.N从这个代码示例继承A的代码?

这样设置的原因是我需要从Base< TType>继承的多个类.和嵌套:基础< TType>服务器只有基数的地方,客户端有扩展的嵌套.通过这种方式,可以很容易地使用代码,在这些代码之间它们之间会有一些共享代码.彼此.

问题是我必须在内部编写相同的代码

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

等等

我已经通过使用接口替换嵌套抽象类来暂时解决了这个问题
A.N:A,INested,但现在我必须在所有嵌套类中重写Base< TType> .Nested代码.目前,嵌套类很小而且易于管理.

希望这不是一个令人困惑的问题……

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

编辑:
我更新了代码示例,以显示我正在尝试实现的目标.
为什么我要这样做,就是保持物理,网络和用户输入分开.
有多个不同的控制器,每个控制器都有自己的包装和放大器.拆包功能,控制器身份和访问物理引擎.

解决方法:

我有一个使用类的ecapsulation而不是继承的解决方案.

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

标签:c,visual-studio-2010,inheritance,nested-class,generics
来源: https://codeday.me/bug/20190708/1406269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有