c # мульти наследование - PullRequest
0 голосов
/ 27 апреля 2010

Итак, у меня есть базовый класс, который требует 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 (Test + Timerr Class:

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. Но по сути это то, что я вызываю другие методы других классов в этой функции. Как я могу решить это?

Ответы [ 6 ]

6 голосов
/ 27 апреля 2010

Зачем вам нужно Test, чтобы быть подклассом Game? У вас есть null, потому что Test объект, созданный в Process из Game, отличается от экземпляра 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();
}

Однако трудно угадать, что вы на самом деле делаете, и дать вам хороший совет.

4 голосов
/ 27 апреля 2010

Вы попали в беду, потому что дизайн вашего объекта неправильный. У вас есть два варианта использования существующих классов: наследование и инкапсуляция. Чтобы выбрать между ними, вы можете использовать is-a и has-a . Выберите правильный выбор из этих тестов:

  1. носок - это гнездо
  2. носок имеет гнездо
  3. Игра Носок
  4. В игре есть носок

Вы выбрали 2 и 3, вы должны были выбрать 1 и 4. Остальные ваши классы тоже не правы. Как только вы внесете эти исправления, вам будет намного легче.

2 голосов
/ 27 апреля 2010

У вас есть Test, который наследуется от Game, у которого есть поле с именем Timers. В классе Game вы инициализируете Timers для этого объекта Game как часть вашего метода Process. Но вы также инициализируете отдельный тестовый объект. Теперь Test, наследуя от Game, имеет свое собственное поле Timers, но это не то же самое, что Timers в игре, которая создала Test. Вот почему таймеры в вашем тесте всегда равны нулю, потому что тот никогда не инициализируется. Вы инициализировали только таймеры в игре, которые также создали тест.

0 голосов
/ 27 апреля 2010

о, я совершенно забыл, что я мог бы только один большой частичный класс. извините, ребята, иногда я просто не думаю о некоторых вещах

0 голосов
/ 27 апреля 2010

Я уверен, что есть веская причина для этого сложного наследования, но с какой стати у вас так много уровней наследования? Это действительно имеет смысл в вашем решении? Я бы посоветовал вам пересмотреть это и вместо этого создать правильный базовый класс (Sock) и наследовать только от этого класса, а затем использовать эти классы, когда вам это нужно.

0 голосов
/ 27 апреля 2010

Timers и Test назначаются только с помощью переопределения метода Process для Game. Похоже, вы нигде не вызываете этот метод, поэтому Timers и Test всегда будут нулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...