Структура, включающая несколько других структур

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Структура, включающая несколько других структур

Сообщение Drag » 04.03.2012 (Вс) 14:05

Приветствую всех. Такой вопрос - есть ли создавать модульные структуры?
Допустим, есть у нас структуры
Код: Выделить всё
Structure Devices
     Dim DevInd() as Short
End Structure
Structure Cargo
     Dim CargInd() as Short
     Sub CargoLoad
     ...
     End Sub
End Structure
Structure SpaceObject
     Dim Pos as Point
End Structure


Так вот, есть ли возможность встроить все переменные и функции структур Devices и Cargo напрямую в структуру SpaceObject так, как будто они изначально находятся в ней, без подклассов?
Я попробовал использовать Inherits (поменяв структуры на классы), но в VB.Net в одной структуре позволяется наследование только от одного класса.
Я не сплю, я перешел в режим замедленного функционирования.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Структура, включающая несколько других структур

Сообщение Admiralisimys » 04.03.2012 (Вс) 15:13

Drag, а что если объявить экземпляры структур Devices и Cargo в структуре SpaceObject?
Код: Выделить всё
Imports System
Imports System.Drawing

Structure Devices
    Public DevInd() As Short
End Structure
Structure Cargo
    Public CargInd() As Short
    Public Sub CargoLoad()
        Console.WriteLine("Structure Cargo -> CargoLoad() Called")
    End Sub
End Structure
Structure SpaceObject
    Public pos As Point
    Public dev As Devices
    Public carg As Cargo
End Structure

Class Test
    <STAThread()> Shared Sub Main()
        Dim so As New SpaceObject()
        so.carg.CargoLoad()
    End Sub
End Class

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Структура, включающая несколько других структур

Сообщение Drag » 04.03.2012 (Вс) 16:31

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

Кстати, а для чего в этом примере <STAThread()>?
Я не сплю, я перешел в режим замедленного функционирования.

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Структура, включающая несколько других структур

Сообщение Admiralisimys » 04.03.2012 (Вс) 17:23

Drag если строгость наследования не принципиальна, можно отнаследовать (вернув снова структуры на классы), Cargo от Devices, а SpaceObject уже от Cargo

Если компилировать в .NET 2.0 и выше эта строчка рекомендуется к применению.
http://www.gotdotnet.ru/forums/2/14073/66747/
http://blogs.msdn.com/b/jfoscoding/arch ... 06341.aspx

Чарльз Петцольд писал(а):Методу Main непосредственно предшествует метод attribute, состоящий из слова STAThread в квадратных скобках. Он указывает исполняющей среде .NET запускать программу в отделенном потоке, что обеспечить корректное ее взаимодействие с СОМ (подробнее см. документацию к STAThreadAttribute в пространстве имен System). Странно, но работающие с буфером обмена программы Windows Forms без этого атрибута часто работают неустойчиво.
Программирование с использованием MS WindowsForms, 2006

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Структура, включающая несколько других структур

Сообщение Drag » 08.03.2012 (Чт) 18:28

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

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.03.2012 (Чт) 22:27

Вложенные Private-переменные с нужными структурами + Properties и функции.

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Структура, включающая несколько других структур

Сообщение Drag » 08.03.2012 (Чт) 23:14

Оу, точно, я про Properties забыл. Спасибо! :)

И вот еще вдогонку просьба проверить, оптимально ли я распланировал структуру программы. Решил я объединить два класса (космические корабли и станции), имеющие много общего (но и заметные различия), в один clsUnit. В clsUnit будет несколько структур, каждая из которых будет содержать отдельный независимый функционал. В классе будут объявлены объектные переменные для каждой из этих структур:
Public Dev as DeviceType
Public Prod as ProductionType
Public Dck as DockingType
(причем внутри каждой структуры будут массивы... либо коллекции, и связанные с ними функции)

У меня будет общий массив элементов класса clsUnit.
Но для одних элементов класса clsUnit будет инициализирована лишь структура Dev (Prod и Dck = Nothing), а для других - Prod и Dck (Dev = Nothing). Оптимально ли такое решение?
Я не сплю, я перешел в режим замедленного функционирования.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.03.2012 (Чт) 23:58

Drag писал(а):Но для одних элементов класса clsUnit будет инициализирована лишь структура Dev (Prod и Dck = Nothing), а для других - Prod и Dck (Dev = Nothing).

Структура не может иметь значение Nothing (насколько я помню, VB позволяет его присваивать, но это интерпретируется иначе). Только класс.

Drag писал(а):Оптимально ли такое решение?

Нет. Вынеси всё общее в базовый класс, который скорее всего следует сделать абстрактным (MustInherit), от которого сделай двух наследников, расширяющих его так, как требуется. При необходимости используй виртуальные свойства и функции (MustOverride/Overridable/Overrides). Храни всё в массиве, объявленном как массив элементов базового класса.

PS: Ты знаешь различия между структурой и классом?

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Структура, включающая несколько других структур

Сообщение Drag » 09.03.2012 (Пт) 9:17

Qwertiy писал(а):Структура не может иметь значение Nothing (насколько я помню, VB позволяет его присваивать, но это интерпретируется иначе). Только класс.

Да, точно, попутал :). Имелись в виду именно классы.

Qwertiy писал(а):Нет. Вынеси всё общее в базовый класс, который скорее всего следует сделать абстрактным (MustInherit), от которого сделай двух наследников, расширяющих его так, как требуется. При необходимости используй виртуальные свойства и функции (MustOverride/Overridable/Overrides). Храни всё в массиве, объявленном как массив элементов базового класса.

:shock: Вот уж до чего я бы точно не додумался... Большое спасибо! Наконец-то понял, как делается наследование :).
Тогда, думаю, в базовый класс все же стоит включить несколько подклассов дополнительного функционала, которые для каждого элемента будут инициализироваться лишь при необходимости

Qwertiy писал(а):PS: Ты знаешь различия между структурой и классом?

Да, разумеется. Структура - набор свойств и методов, а класс - полноценный объект с поддержкой событий, конструкторов и наследования.
Я не сплю, я перешел в режим замедленного функционирования.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.03.2012 (Пт) 11:27

Drag писал(а):Тогда, думаю, в базовый класс все же стоит включить несколько подклассов дополнительного функционала, которые для каждого элемента будут инициализироваться лишь при необходимости

Сформулировано настолько туманно, что я не знаю, правильно это или нет. В базовом классе должно быть только то, что есть (или может быть) у обоих.

Drag писал(а):
Qwertiy писал(а):PS: Ты знаешь различия между структурой и классом?

Да, разумеется. Структура - набор свойств и методов, а класс - полноценный объект с поддержкой событий, конструкторов и наследования.

Судя по этому ответу - всё-таки нет. Основное различие - это то, что структура - это value-тип, а класс - reference-тип, со всеми вытекающими отсюда последствиями.
А то что ты написал, вообще кажется сомнительным. Конструкторы в структуре быть могут, но только с параметрами. И объявить событие тоже можно, хотя у меня никогда раньше не возникало необходимости их там использовать. К тому же, утверждать, что структура неполноценна, как-то неправильно. Для своих целей она вполне подходит.

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re:

Сообщение Drag » 09.03.2012 (Пт) 20:59

Qwertiy писал(а):Сформулировано настолько туманно, что я не знаю, правильно это или нет. В базовом классе должно быть только то, что есть (или может быть) у обоих.

Поясню на примере. Допустим, у базового класса clsUnit есть такой "плагин"(буду так называть эти подклассы, расширяющие функциональность)
Public Weapon as TypeUnitWeapon
Возьмем теперь для примера космический корабль Unit(1). Изначально, Unit(1).Weapon = Nothing, но если на корабль устанавливается оружие, то он получает возможность стрелять, и, следовательно, выполняется Unit(1).Weapon = New TypeUnitWeapon. В случае, если оружие снимается, этот плагин можно уничтожить.

Ну да, неудачно выразился. Под "полноценным объектом" я имел в виду reference-тип.
Я не сплю, я перешел в режим замедленного функционирования.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.03.2012 (Пт) 23:44

Drag писал(а):Поясню на примере

Опять туманно :)
Если оружие может быть как у корабля, так и у станции, то всё верно. Если станция не может обладать этим оружием, то оно должно быть вынесено в класс корабля. Если одно поле выделено для различных типов оружия, частью из которых может обладать корабль, а частью станция, то (на мой взгляд) вынесение в базовый класс логично.
Про Nothing и New всё правильно.

Drag
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 85
Зарегистрирован: 29.01.2005 (Сб) 23:54
Откуда: Москва

Re: Структура, включающая несколько других структур

Сообщение Drag » 10.03.2012 (Сб) 10:25

Еще раз спасибо за помощь :)
Я не сплю, я перешел в режим замедленного функционирования.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 10.03.2012 (Сб) 13:19

Не за что :)


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList