Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2010, 22:43   #1
boris-blade
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 53
По умолчанию Вложенность VS наследование - не догоняю

Код:
public class Game_class
    {
...
public Player_class player;
public int Round{get;set;}
Код:
    public class Player_class
    {
...
        Game_class game111 = new Game_class();  //так по ходу тупо
public int Method1()
{
return game111.Round;
}
в классе Game_class говорю, что player - объект класса Player_class (он инициализируется и в конструкторе)
в классе Player_class мне надо работать с полями класса Game_class(не статичными, а изменяющимися для данного объекта класса Game_class)
прога:
Код:
...
Game_class game1 = new Game_class();
int var1 = game1.player.Method1()
Прога должна записать в var1 значение свойства Round именно того объекта game1, вложенным в кот. является наш объект player
boris-blade вне форума Ответить с цитированием
Старый 12.03.2010, 23:13   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от boris-blade Посмотреть сообщение
....
Прога должна записать в var1 значение свойства Round именно того объекта game1, вложенным в кот. является наш объект player
Код:
    public class Game_class
    {
        public Game_class()
        {
            player = new Player_class(this);
        }
        public Player_class player;
        //...
    }

    public class Player_class
    {
        private Game_class owner;
        public  Player_class(Game_class aOwner)
        {
            owner = aOwner;
        }
        public int Method1()
        {
            return owner.Round;

        }
//...
alexBlack вне форума Ответить с цитированием
Старый 12.03.2010, 23:31   #3
boris-blade
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 53
По умолчанию

Спасибо за оперативный ответ.
Конечно, вариант передавать в конструктор "начальствующий" объект в кач. параметра, я всегда держал в голове. Но блин - придется везде в конструтор класса добавлять параметр.
А нет ли какого метода Owner, наследуемого может от самого System.Object, возвращающео ссылку на объект, создавший текущий объект?
в моем случае game1.player.Owner являлось бы game1

Или во - мегаВЕСЧЬ:
как мне написать интерфейс с методом Creator, кот. будет выполнять поставленную задачу?
тогда я тупо укажу, что нужные мне классы юзают этот интерфейс и тогда у всех объектов этих классов появится метод Creator
в кранем случае этот метод вернет ссылку на Main() или Form1() или какой-то подобный объект или статичный класс

Последний раз редактировалось boris-blade; 12.03.2010 в 23:38.
boris-blade вне форума Ответить с цитированием
Старый 13.03.2010, 12:07   #4
boris-blade
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 53
По умолчанию

возникли траблы
мне необходимо в рамках методов вложенных классов изменять поля нчальствующего объекта, т.е. в нашем примере Method1 должен иметь возможность изменить Round.
Я передаю в конструкторы начальствующий объект с параметров ref - среда ругается - говорит
Невозвожно передать this с ключевым словом ref/out - он доступен только для чтения
boris-blade вне форума Ответить с цитированием
Старый 13.03.2010, 12:36   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

правильно говорит.

Код:
            Game_class C = this;
            player = new Player_class(ref C);
хотя и непонятно зачем. Вы же не собираетесь менять owner, а owner.round доступно для изменения и без этого

Цитата:
Сообщение от boris-blade Посмотреть сообщение
А нет ли какого метода Owner, наследуемого может от самого System.Object, возвращающео ссылку на объект, создавший текущий объект?
в моем случае game1.player.Owner являлось бы game1
Насколько я знаю нет

Цитата:
Или во - мегаВЕСЧЬ:
как мне написать интерфейс с методом Creator, кот. будет выполнять поставленную задачу?
тогда я тупо укажу, что нужные мне классы юзают этот интерфейс и тогда у всех объектов этих классов появится метод Creator
в кранем случае этот метод вернет ссылку на Main() или Form1() или какой-то подобный объект или статичный класс
[/QUOTE]

Все равно придется писать реализацию для интерфейса в каждом классе. М.б. тогда унаследовать Player_class от некоего базового, в котором будут нужные методы
alexBlack вне форума Ответить с цитированием
Старый 13.03.2010, 16:13   #6
boris-blade
Пользователь
 
Регистрация: 18.12.2009
Сообщений: 53
По умолчанию

Код:
public class Game_class
    {
        public Game_class()
        {
            Game_class this_game = this;
            for (int i = 1; i <= 10; i++)
            {

                player[i] = new Player_class(ref this_game);  //ругаеццо сдесь
                player[i].Seat = i;
            }
при попытке Game_class my_game = new Game_class();
пишет:
System.NullReferenceException не обработано
Message="В экземпляре объекта не задана ссылка на объект."

проверял this_game - она не null

также - надо ли this_game указывать среди полей класса Game_class? я пробовал и так, и эдак - одна фигня
boris-blade вне форума Ответить с цитированием
Старый 13.03.2010, 17:30   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Написал маленький тест. У меня выполняется без ошибок. И, конечно, логичнее сделать полем класса, а не локальной переменной. Но дело даже не в этом. Еще раз: зачем нужна передача по ссылке в данном случае ? И что будет если один из экземпляров Player_class изменит это значение - поменяются владельцы у всего списка player, т.е. классу Player_class доступны изменения, которые он не вправе делать.

// И почему цикл от 1-цы ? Может отсюда NullReference
alexBlack вне форума Ответить с цитированием
Старый 16.03.2010, 08:08   #8
canki
 
Регистрация: 16.03.2010
Сообщений: 6
По умолчанию

Цитата:
public class Game_class
{
public Game_class()
{
Game_class this_game = this;
for (int i = 1; i <= 10; i++)
{

player[i] = new Player_class(ref this_game); //ругаеццо сдесь
player[i].Seat = i;
}
массив тоже нужно инициализировать
вообще говоря переменые поумолчанию передаются по ссылке, так что слово ref излишне

вообще передача родительского класса вполне логичный вариант,
но есть альтернатива: в классе player создать событие, а в классе game привязать к нему обработчик в котором изменять нужные данные, которые можно передать как параметры события
canki вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование на C++ dziga1989 Помощь студентам 5 22.10.2009 11:25
Наследование alex_triton Общие вопросы C/C++ 0 19.10.2009 20:25
Просто не догоняю как сделать, плиз помогите Великие ПРОГРАМЕРЫ )) PUSHkiN Помощь студентам 12 12.06.2008 17:57
Как отобразить категории, имеющие вложенность произвольной глубины?! Aska БД в Delphi 4 31.10.2007 01:03