Выражаю огромную благодарность подписчику, который в комментариях к прошлому посту подсказал решение проблемы. Вот что бывает, когда пишешь на языке, который не знаешь.
Оказывается, шарп позволяет по разному имплементировать методы с одинаковыми названиями, но объявленными в разных интерфейсах, и вызывать нужную имплементацию в зависимости от того, к переменной какого типа ты обращаешься. Это называется Explicit Interface Implementation, по ссылке можно подробно почитать про это.
Соответственно, проблема из предыдущего поста решается следующим образом:
public interface ICollectable
{
CollectableSkin Skin { get; }
}
public abstract class CollectableType<TSkin> : ScriptableObject, ICollectable where TSkin : CollectableSkin
{
[field: SerializeField] public TSkin Skin { get; private set; }
CollectableSkin ICollectable.Skin => Skin;
}
Это именно то, что мне было нужно. В тех местах, где у меня переменная базового типа
ICollectable, я получу базовый класс CollectableSkin, а там, где будет какой-то конкретный тип CollectableType<TSkin>, я получу конкретный TSkinСтавь 🔥 если не знал про такое, 🤡 если для тебя это было очевидно.