Подтвердить что ты не робот

Предпочтение использования между структурой и классом на языке D

Когда я должен определять тип как структуру или как класс?

Я знаю, что struct - это типы значений, а классы - ссылочные типы. Поэтому мне интересно, например, определить стек как структуру или класс?

4b9b3361

Ответ 1

Причина № 1, чтобы выбрать struct vs class: классы имеют наследование, а структуры - нет. Если вам нужен полиморфизм, вы должны использовать классы.

Причина № 2:. Структуры обычно являются типами значений (хотя вы можете сделать их ссылочными типами, если вы работаете на нем). Классы всегда являются ссылочными типами. Итак, если вы хотите тип значения, выберите структуру. Если вам нужен ссылочный тип, проще всего пойти с классом.

Причина № 3: Если у вас есть тип с большим количеством членов данных, тогда вам, вероятно, понадобится ссылочный тип (чтобы избежать дорогого копирования), и в этом случае вы, вероятно, собирается выбрать класс.

Причина № 4: Если вы хотите детерминированное уничтожение своего типа, тогда вам понадобится структура в стеке. Ничто в куче GC не имеет детерминированного разрушения, и деструкторы/финализаторы материала на куче GC никогда не могут быть запущены. Если они будут собраны GC, то их финализаторы будут запущены, но в противном случае они не будут. Итак, если вы хотите, чтобы ваш тип автоматически уничтожался, когда он покидал область видимости, вам нужно использовать структуру и поместить ее в стек.

Что касается вашего конкретного случая, контейнеры обычно должны быть ссылочными типами (копирование всех их элементов каждый раз, когда вы проходите один вокруг, было бы безумно дорогостоящим), а Stack - это контейнер, поэтому вы захотите использовать класс, если вы не захотите сделать его структурой с подсчетом ссылок, что явно более эффективно. Это просто имеет преимущество, гарантируя, что его деструктор будет работать, когда он больше не будет использоваться.

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

Ответ 2

Прочитайте "D" на языке программирования D

В D вы получаете структуры, а затем получаете классы. Они имеют множество удобств, но имеют разные уставы: структуры - это типы значений, тогда как классы предназначены для динамического полиморфизма и доступны только по ссылке. Таким образом, путаницы, связанные с клонами ошибки и комментарии à la//Нет! НЕ НАЙТИ! не существует. Когда вы создаете тип, вы решаете, будет ли он мономорфным значением или полиморфной ссылкой. С++ классно позволяет определять типы двусмысленных гендерных групп, но их использование является редким, подверженным ошибкам и недопустимым, что позволяет просто избегать их по дизайну.

Для вашего типа Stack вам, вероятно, лучше всего сначала определить interface, а затем его реализацию (используя class), чтобы вы не привязывали конкретную реализацию вашего типа Stack к его интерфейс.