Естественно, я подумал о том, чтобы эти типы реализовывали интерфейс.
Но с помощью интерфейсов можно объявлять только свойства, не поля...
Проблема:
Поскольку это векторы типов значений, я не могу изменить .X больше не похоже на поле:
Невозможно изменить возвращаемое значение «выражения», поскольку оно не является переменной
Решение 1:
Создайте переменную из вектора, измените ее, присвойте обратно свойству.
Это работает, но мне придется обновить тонны кода, чтобы это было непрактично...
Решение 2:
Используйте векторный класс ссылочного типа.. . работает, но это уже не тип значения!
Есть веская причина, почему векторные типы в большинстве API создаются как типы значений...
Пример кода:
Код: Выделить всё
using System;
using UnityEngine;
public interface IEntity
{
public Vector3Int Position { get; set; } // ideal vector, a value type
public Vector3IntRef PositionRef { get; set; } // attempt to fix the problem
}
public class Entity : IEntity
{
public Vector3Int Position { get; set; }
public Vector3IntRef PositionRef { get; set; } = new();
}
public class Test
{
public Test()
{
var entity = new Entity();
// Problem, cannot modify .x in vector because it is a property:
entity.Position.x = 4; // CS1612 Cannot modify the return value of 'Entity.Position' because it is not a variable
// Possible fix but will be a pain to update all places to do like this:
var position = entity.Position;
position.x = 4;
entity.Position = position;
// Possible fix using a reference type:
entity.PositionRef.X = 4; // now that works
entity.PositionRef = Vector3Int.zero; // operator works but creates a new instance...
}
}
public sealed class Vector3IntRef
{
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
public static implicit operator Vector3Int(Vector3IntRef v)
{
return new Vector3Int(v.X, v.Y, v.Z);
}
public static implicit operator Vector3IntRef(Vector3Int v)
{
return new Vector3IntRef { X = v.x, Y = v.y, Z = v.z };
}
}
Можете ли вы предложить альтернативный шаблон, который я, возможно, пропустил?
(учитывая, что будет много мест для обновления, т. е. минимизации шаблонного кода)
Подробнее здесь: https://stackoverflow.com/questions/781 ... -interface