Контейнерный класс C # - PullRequest
       9

Контейнерный класс C #

0 голосов
/ 29 декабря 2010

Я создаю игру на c #, которая позволяет вам писать сценарии на своем собственном уровне, хотя я натолкнулся на небольшую мысль.

У меня есть базовый класс с именем "World" в качестве объекта.Это было сделано просто:

class World {

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

World.ParentObjectName.ParentObjectProperty = "abc";

Я знаю, что System.Windows.Forms.Panel и другие классы похожи на контейнеры и могут содержать объекты в них и бытьдоступ таким способом ... мой вопрос в том, как я могу создать класс, похожий на контейнер, в который я могу добавлять объекты, а затем обращаться к ним с помощью World.ObjectName

, который я пробовал class World : System.Collections.CollectionBase, но с помощью этого метода я должен продолжать набирать World.Item("ObjectName")

Может кто-нибудь помочь?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 29 декабря 2010

Лучшее, что вы можете сделать, это добавить indexer вот так:

public string this[string name]
{
    get
    {
        return this.Item(name);
    }
}

Предположим, Item() уже работает, и назовите его так:

string value = world["ObjectName"];
1 голос
/ 29 декабря 2010

К сожалению, System.Windows.Forms.Panel на самом деле не может этого сделать, и вы тоже не сможете. Что касается случая Windows Forms, то происходит то, что соответствующие свойства автоматически генерируются для класса, производного от Panel. Это означает, что действительно будут именованные свойства для элементов управления, добавленных вами через конструктор; однако, это было основано на информации, доступной во время разработки / компиляции. Обратите внимание, что если вы динамически добавляете элементы управления AT RUNTIME в приложение Windows Forms, никакие соответствующие свойства не будут волшебным образом появляться в объекте Panel (хотя они будут доступны через обычный интерфейс коллекции). Это автоматическое создание аксессоров может создать впечатление, что в Panel есть что-то особенное, но на самом деле этого нет.

0 голосов
/ 29 декабря 2010

При проектировании Form с, Panel с и т. Д. Visual Studio генерирует код для каждого элемента, перетаскиваемого в представление дизайна. Вы можете найти этот автоматически сгенерированный код в xxx.designer.cs файлах. Вам нужна именно эта особенность Visual Studio, а не класса Form или Panel.

Вы должны выполнить генерацию кода (как сказал Shadow Wizard), чтобы достичь того же. Иначе это невозможно, по крайней мере, насколько мне известно.

0 голосов
/ 29 декабря 2010

Прежде всего, в System.Windows.Forms.Panel, System.Windows.Forms часть - это просто пространство имен, а Panel - это класс.

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

class World
        {
            public static class ParentObject
            {
                public static int memberX;
            }
        }

Тогда вы можете использовать их непосредственно с именем класса как

 World.ParentObject.memberX = 10;

Но я все еще не думаю, что это будет возможным решением для вас.

0 голосов
/ 29 декабря 2010

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

Например, ваш World может выглядеть так:

class World
{
    private string _ObjectName;

    public string ObjectName
    {
        get 
        {
           return _ObjectName; 
        }
        set 
        {
           _ObjectName= value; 
        }
    }
}

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

World myWorld = new World();
myWorld.ObjectName = "Home World";


Для получения дополнительной информации прочитайте этот учебник о добавлении свойств к классам в C # и недавно обновленное C # Руководство по программированию относительно свойств.

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