Как смоделировать неизвестное количество переменных с C # - PullRequest
1 голос
/ 07 июня 2011

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

У меня будут разные формы, и у всех будут разные переменные.Например, для описания конкретной фигуры AI нужно:

Обязательные поля для каждой фигуры:

  • начальная и конечная точка (состоит из 3 двойных переменных: x, y ия)

  • имя (строка)

Форма может нуждаться в следующих полях или нет (возможно, в будущем мне понадобится больше)

  • Длина, ширина, высота (все двойные)
  • Угол
  • Другие переменные, которые могут быть двойными или строковыми

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

<?xml version="1.0" encoding="utf-8" ?> 
<structure name="Cube">
    <variables>
        <point name="start" />
        <point name="end" />
        <length name="width" min="1" max="10000" unit="mm" />
        <length name="height" min="1" max="10000" unit="mm" />
    </variables>
    <points>
        <point name="topLeft">
            <x>start.x</x>
            <y>start.y - height/2</y>
            <z>start.z</z>
        </point>
        <point name="topRight">
            <x>end.x</x>
            <y>end.y - height/2</y>
            <z>end.z</z>
        </point>
        <point name="bottomLeft">
            <x>start.x</x>
            <y>start.y + height/2</y>
            <z>start.z</z>
        </point>
        <point name="bottomRight">
            <x>end.x</x>
            <y>end.y + height/2</y>
            <z>end.z</z>
        </point>
    </points>
    <connections>
        <connection type="line">
            <point name="topLeft" />
            <point name="topRight" />
            <point name="bottomRight" />
            <point name="bottomLeft" />
            <point name="topLeft" />
        </connection>
    </connections>
</structure>

Итак, я думал, что у меня есть базовый класс CVariable (с двумя абстрактными методами, parseString и toString), который я потом наследую, чтобы сделать CLength (новый атрибут двойной длины), CPoint (новый атрибут double x, y и z) и CName (имя новой строки атрибута).Затем я могу иметь класс с именем CShape, у которого есть список CVariable, CPoint и CName (соединения, просто имя, идентифицирующее точку, которую нужно соединить).Я считаю, что проблема в том, что если у меня есть список CVariable, я не могу получить доступ к новым атрибутам.Я прав?

Извините, если неясно, я отредактирую, чтобы добавить любую необходимую информацию.Заранее большое спасибо.

Ответы [ 2 ]

1 голос
/ 07 июня 2011

Схема, в которой вы думаете, обычно называется «вариантом».CVariable не подходит для этого, оно просто не определено.Но ты уже думаешь в правильном направлении.Исходя из общего базового класса, вы можете упаковать элементы в общий контейнер.Хитрость для доступа к этим производным типам заключается в использовании информационной системы типа времени выполнения: есть ключевое слово typeof, сообщающее вам фактический тип объекта, на который вы ссылаетесь: http://msdn.microsoft.com/de-de/library/58918ffs.aspx

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

0 голосов
/ 07 июня 2011

Из того, что я вижу, ты перерабатываешь. Почему бы просто:

<cube center-x="44" center-y="-43" center-z="20" edge-length="42" />
<sphere center-x="0" center-y="1" radius="3" />

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

Если, однако, вам необходимо описать произвольный 3D-объект, вам нужно описать отдельные грани и вершины.

Я мог бы быть в массовом порядке, но опять же: я не знаю всех требований.

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