Я бы не сделал бы это.
Это просто сохранить печать в любом случае, и это снизит вашу производительность, поскольку B3.MyA
по существу сделает return (A3)(A2)this.MyA;
.Слишком много ненужных приведений, пока вы можете делать b3.MyA as A3
напрямую, только если это необходимо.
Также, если вы забудете инициализировать MyA
в B3
объекту типа A3
, ваше приведение не удастся, так какэто будет объект типа A1
или A2
или любой другой.Вы можете легко выстрелить себе в ногу.
Редактировать : Суть того, что я написал: это НЕ типобезопасный способ сделать это, и это никогда не будет.Вы можете минимизировать риск этого (например, как показывает ваш отредактированный код), но возможность все еще есть.ИМХО преимущества такой конструкции не оправдывают опасности.
Edit2 : обратите внимание на ваш Technically it would work, but it just gets very complicated.
в общем подходе.
Не так сложно, ИМХО.Для сравнения:
public abstract class B1<TA, TC> where TA: A1 where TC: A1
{
public TA MyA { get; protected set; }
public TC MyC { get; protected set; }
}
public abstract class B2<TA, TC> : B1<TA, TC> where TA : A2 where TC : A2
{
}
public class B3 : B2<A3, A3>
{
}
Меньше кода, больше безопасности и помните, что вы всегда можете использовать выражение using
, если вам не нравится слишком много печатать:
using ClassicB2 = MemberHiding.B2<MemberHiding.A3, MemberHiding.A3>;
ClassicB2 b3 = new B3();