В дополнение к предыдущему посту, реальный пример с реальной проблемой.
Есть сущность CollectableType, это базовый класс, SO, описывающий параметры предметов, которые можно найти на карте.
public interface ICollectable
{
CollectableSkin Skin { get; }
}
public abstract class CollectableType<TSkin> : ScriptableObject, ICollectable where TSkin : CollectableSkin
{
// Property 'Skin' cannot implement property from interface 'Game.SO.Gems.ICollectable'. Type should be 'Game.SO.CollectableSkin'.
[field: SerializeField] public TSkin Skin { get; private set; }
}
Есть сущность CollectableSkin, это SO, описывающий внешний вид предметов.
public class CollectableSkin : ScriptableObject
{
[field: SerializeField] public TileBase Tile { get; private set; }
}
Среди предметов, бывают, например, бомбы. Бомбы наследуются от CollectableType
public class BombType : CollectableType<BombSkin>
{
[field: SerializeField] public float Damage { get; private set; }
}
И используют свой дочерний класс внешнего вида, BombSkin, в котором есть поля, специфичные для бомб.
public class BombSkin : CollectableSkin
{
[field: SerializeField] public AnimationClip Explosion { get; private set; }
}
В тех местах, где я работаю с базовым типом CollectableType, мне достаточно только базовых полей CollectableSkin. Но там, где я работаю конкретно с бомбами, мне нужно, чтобы свойство Skin возвращало именно BombSkin, так как там есть конкретные поля для бомб.
P. S. Мы же не всерьёз считаем принудительный каст безопасным решением проблемы?
P. P. S. Залетайте на
стрим, обсудим проблему вживую, покажу, как я её решил.