Производные классы в Unity: механизмы обращения к производным полям


Зарабатывай на файлах

Рекомендую
Программа для комплексного анализа сайта


Хостинг

Апы

Пользуюсь

Партнёры
2leep.com

Подписка

Календарь
«    Январь 2014    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 

Считалки
Рейтинг@Mail.ru

Участник Blograte.ru

Дата публикации: 10.05.2025

Производные классы в Unity: механизмы обращения к производным полям

d179c208

Содержимое статьи:

В Unity, производные классы расширяют базовый класс, добавляя новые функции и данные. Рассмотрим следующий сценарий:

Сценарий

У вас есть базовый класс BaseClass с переменной baseValue. От него наследуется несколько производных классов:

public class BaseClass {
public int baseValue;
}
public class DerivedClass1 : BaseClass {
public int derivedValue1;
}
public class DerivedClass2 : BaseClass {
public int derivedValue2;
}

Проблема

У вас есть массив baseClassArray типа BaseClass[] в скрипте Monobehaviour. В массив могут быть помещены экземпляры как базового, так и производных классов:

public class TestScript : Monobehaviour {
public BaseClass[] baseClassArray;
}

Однако, доступ к полям производного класса напрямую невозможен:

// Не работает
int derivedValue1 = baseClassArray[0].derivedValue1;

Решения

1. Проверка типа и приведение

Проверьте тип каждого элемента массива и приведите его к соответствующему производному типу:

for (int i = 0; i < baseClassArray.Length; i++) {
if (baseClassArray[i] is DerivedClass1) {
// Приведение к DerivedClass1
DerivedClass1 derived1 = (DerivedClass1)baseClassArray[i];
int derivedValue1 = derived1.derivedValue1;
}
}

2. Использование интерфейсов

Создайте интерфейс с полями, которые вам нужны из производных классов. Реализуйте этот интерфейс в производных классах. Затем, можно получить доступ к полям интерфейса:

public interface IBaseInterface {
int baseValue { get; set; }
}
public class DerivedClass1 : BaseClass, IBaseInterface {
public int derivedValue1 { get; set; }
public int baseValue { get; set; }
}
// ...
for (int i = 0; i < baseClassArray.Length; i++) {
if (baseClassArray[i] is IBaseInterface) {
IBaseInterface baseInterface = (IBaseInterface)baseClassArray[i];
int derivedValue1 = baseInterface.baseValue;
}
}

3. Использование рефлексии

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

for (int i = 0; i < baseClassArray.Length; i++) {
Type type = baseClassArray[i].GetType();
FieldInfo fieldInfo = type.GetField("derivedValue1");
int derivedValue1 = (int)fieldInfo.GetValue(baseClassArray[i]);
}

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



Английский видеочат для студентов
Автошколы Курска: цены и условия
Цена биткоина сейчас
Чат рулетка 2026: Динамичные взаимодействия
Чат-рулетка для общения: случайный собеседник онлайн
Чат с Аней: Открытое общение
Генератор этикеток с ценой
ИИ и продвижение сайтов: поисковики и соцсети
ИП и ООО: что выбрать для онлайн-бизнеса?
Как использовать качественные backlinki для индексации
Как найти друзей в интернете
Как правильно использовать sitemap для индексации
Как выбрать правильный движок сайта
Как выжить в Roblox
Какие технические решения ускоряют индексацию сайта
Общение в реальном времени
Ошибки, которые могут заблокировать индексацию сайта
Ошибки, которые замедляют индексацию в Google Яндекс
Практическое руководство по быстрой индексации сайта
Ремонт квартир в новостройках
Русский Онлайн Чат Видео
Сколько получают SEO-специалисты
Сравнение методов ускоренной индексации страниц
Теплоизоляция в Твери и Тверской области
Трубная продукция для трубопроводных решений
Vdsina: Светлая цель

Наши ссылки