Производные классы в Unity: механизмы обращения к производным полям
Содержимое статьи:
- Сценарий
- Проблема
- Решения
- 1. Проверка типа и приведение
- 2. Использование интерфейсов
- 3. Использование рефлексии
В 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]);
}
Выбирайте метод, который лучше всего подходит для вашего конкретного сценария и требований к производительности.



Подпишись на новости этого блога по RSS!!!