【问题标题】:c# multi inheritancec# 多继承
【发布时间】:2011-02-12 20:21:24
【问题描述】:

所以我得到了一个需要 Socket 的基类:

class Sock
{
    public Socket s;

    public Sock(Socket s)
    {
        this.s = s;
    }

    public virtual void Process(byte[] data) { }
    ...
}

然后我又上了一节课。如果一个新的套接字被接受,那么这个类的一个新实例将被创建:

class Game : Sock
{
    public Random Random = new Random();

    public Timerr Timers;
    public Test Test;

    public Game(Socket s) : base(s) { }

    public static void ReceiveNewSocket(object s)
    {
        Game Client = new Game((Socket)s);
        Client.Start();
    }

    public override void Process(byte[] buf)
    {
        Timers = new Timerr(s);
        Test = new Test(s);
        Test.T();
    }
}

在 Sock 类中,我得到了一个被 Game 类覆盖的虚函数。(进程函数)在这个函数中,我从测试类调用了一个函数(Test+ Timerr 类:

class Test : Game
{
    public Test(Socket s) : base(s) { }

    public void T()
    {
        Console.WriteLine(Random.Next(0, 10));
        Timers.Start();
    }
}

class Timerr : Game
{
    public Timerr(Socket s) : base(s) { }

    public void Start()
    {
        Console.WriteLine("test");
    }
}

所以在 Process 函数中,我在 Test 中调用了一个函数。在这个函数(T)中,我需要从 Timerr 类调用一个函数。但问题是它总是 NULL ,尽管在 Process 中调用了构造函数。例如可以调用随机类,我猜是因为它是用构造函数定义的。:

public Random Random = new Random();

这就是为什么其他类(没有构造函数):

public Timerr Timers;
public Test Test;

在继承的类Test中总是空的。但是它的本质是我在这个函数中调用其他类的其他方法。我该如何解决这个问题?

【问题讨论】:

    标签: c# class inheritance static


    【解决方案1】:

    哦,我完全忘记了我可以只参加一个大的部分课程。对不起各位,有时候我只是想一些事情

    【讨论】:

    • 由于这更像是对您的问题的评论而不是答案,因此最好将其设为评论。
    【解决方案2】:

    您遇到麻烦是因为您的对象设计错误。使用现有类有两种选择:继承和封装。要在它们之间进行选择,您可以使用is-a and has-a test。从这些测试中选择正确的选择:

    1. Sock 是一个 Socket
    2. 袜子有一个插座
    3. 游戏是袜子
    4. 游戏有袜子

    你选择了 2 和 3,你应该选择了 1 和 4。你的其他课程也同样错误。进行这些更正后,您会发现它变得容易多了。

    【讨论】:

      【解决方案3】:

      我确信这种复杂的继承是有正当理由的,但是你到底为什么会有这么多层次的继承呢?这在您的解决方案中真的有意义吗?我建议您重新考虑这一点,而是创建一个适当的基类(Sock)并仅从该类继承,然后在需要时使用这些类。

      【讨论】:

        【解决方案4】:

        为什么需要Test 成为Game 的子类?您拥有null,因为在GameProcess 中创建的Test 对象与Game 对象的实例不同。可能你需要的是

        class Test 
        {
            Game Game;
            public Test(Game g)
            {
                Game = g;
            }
        
            public void T()
            {
                Console.WriteLine(Random.Next(0, 10));
                Game.Timers.Start();
            }
        }
        

        public override void Process(byte[] buf)
        {
            Timers = new Timerr(s);
            Test = new Test(this);
            Test.T();
        }
        

        但是很难猜出你实际上在做什么并给你一个好的建议。

        【讨论】:

        • +1 我也相信组合比继承更适合这种情况。
        【解决方案5】:

        您有Test,它继承自Game,它有一个名为Timers 的字段。在 Game 类中,您将该 Game 对象的 Timers 初始化为 Process 方法的一部分。但是你也初始化了一个 separate Test 对象。现在,通过从 Game 继承,Test 有自己的 Timers 字段,但这与创建 Test 的 Game 中的 Timers 不同。这就是为什么您的测试中的计时器始终为空的原因,因为该计时器从未被初始化。您只在同样创建了测试的游戏中初始化了计时器。

        【讨论】:

        • +1 我只是在写完全相同的东西。打败我:)
        【解决方案6】:

        TimersTest 仅由Game 上的Process 方法覆盖分配。您似乎没有在任何地方调用此方法,因此 TimersTest 将始终为空。

        【讨论】:

          猜你喜欢
          • 2017-03-31
          • 1970-01-01
          • 1970-01-01
          • 2012-05-14
          • 2013-08-28
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多