Ужасная проблема с получением моей головы вокруг ООП (C #) - PullRequest
0 голосов
/ 08 апреля 2011

Я давно пользуюсь не-ООП-языками (в основном сценариями или веб-разработкой), такими как Lua.Сейчас я становлюсь достаточно продвинутым в C #, но с точки зрения моего текущего проекта я попал в тупик.

Я создаю своего рода игру, в которой вы создаете 2D-среду различных типов.вещей.

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

Но это не моя проблема.У меня абсолютно НЕТ ИДЕИ, как заставить экземпляр класса взаимодействовать с другим экземпляром класса, который экземпляр класса не создавал.

По сути, я сделал интерфейс «Вставка» с кнопкой для вставки кусочкарельеф, который затем должен появиться в Treeview1.Как я могу сказать форме «ответить», что пользователь выбрал местность (я использую перечисление для того, что они выбрали), и сказать форме, чтобы добавить узел в древовидную структуру?

Ответы [ 5 ]

4 голосов
/ 08 апреля 2011

Есть пара вещей, которые вы могли бы сделать.

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

Я собираюсь продемонстрировать отношения родителей и детей.

public class Book
{
    public string BookText { get; set;}
}

public class Library
{
    private Book myBook = new Book();
}

В этом случае библиотека может ссылаться / говорить / общаться с книгой, потому что она осведомлена о книге. Но в этом случае вы должны создать книгу при создании библиотеки. Давайте изменим это, чтобы мы могли добавлять книги в библиотеку.

public class NewBook
{
    public string BookText {get;set;}
    public Library ParentLibrary {get;set;}
}

public class BetterLibrary
{
    private List<NewBook> books = new List<NewBook>();

    public bool AddNewBookToLibrary(NewBook bookToAdd)
    {
        books.Add(bookToAdd);
        booktoAdd.ParentLibrary = this;
    }
}

Теперь мы создали библиотеку, в которую мы можем добавлять книги, и теперь библиотека может общаться с любой добавленной книгой. Библиотека имеет возможность перебирать коллекцию книг и выполнять некоторые действия с каждой книгой.

Кроме того, каждый экземпляр NewBook, добавленный в библиотеку, знает, какой экземпляр библиотеки является его родительским, и может получать доступ к общедоступным функциям в родительской библиотеке.

Это простой подход к подключению экземпляров. Его можно применить к любому классу, который вы создали. Классы книги и библиотеки можно заменить элементами управления и контроля родительских или родительских / дочерних отношений в любом объекте, отображаемом в древовидных представлениях.

Это отвечает на ваш вопрос? Оставьте комментарий, и я обновлю, если вам нужно больше.

3 голосов
/ 08 апреля 2011

Существует несколько способов взаимодействия экземпляров объектов. Часто они вызывают события, а другой экземпляр может зарегистрировать обработчик событий для этого события.

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

1 голос
/ 08 апреля 2011

Объявить, вызвать событие и потреблять его.

Форма глагола экземпляра - "экземпляр".

0 голосов
/ 08 апреля 2011

Если я правильно понимаю, вам нужна какая-то общая модель.Модель может быть обработана двумя способами:

  1. Чтобы сгенерировать некоторые чертежи с использованием XNA
  2. Чтобы заполнить древовидное представление, чтобы вы могли отредактировать его

Iпонять, что есть одна модель, которая определяет ваш 2D мир.Поэтому можно использовать статический метод для получения модели, которая в данный момент загружена в ваше приложение (например, WorldEnvironment.Current).Ваш игровой движок должен нарисовать то, что он находит в WorldEnvironment.Current.С другой стороны, используйте Winforms для редактирования этого экземпляра WorldEnvironment.Current.Любые изменения будут видны другому «представлению» (либо представлению XNA, либо WinForms).Некоторое время назад я делал нечто подобное, используя XNA в одном окне и WPF в другом.

В других типах приложений я бы рекомендовал избегать статических методов и использовать некоторый шаблон Inversion of Control / Dependency Injection с зарегистрированными синглетонами илиименованные экземпляры, если это необходимо.Но для простого редактора игр я думаю, что это самый простой способ.

0 голосов
/ 08 апреля 2011

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

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