Вы довольно близко, но, как пишет TheGeneral в своем комментарии, вы не можете изменить тип свойства при его переопределении.
Что вы можете сделать, это ввести новое свойство (я выбрал использование интерфейсов, но оно будет работать точно так же и с абстрактными классами), которое будет использоваться в коде с явным приведением в каждом частичном классе:
Итак, во-первых, я создал интерфейсы:
public interface IColor { string ColorDescription { get; set; } }
public interface IShape { IColor BaseContent { get; set; } }
Затем добавили реализацию IColor
к классам Color1
и Color2
:
public partial class Color1 : IColor {}
public partial class Color2 : IColor {}
(Это было легко, так как ColorDescription одинакового типа для обоих цветов).
Затем я добавил реализацию IShape
к классам Shape1
и Shape2
:
public partial class Shape1 : IShape
{
public IColor BaseContent
{
get { return Content; }
set { Content = (Color1) value; }
}
}
public partial class Shape2 : IShape
{
public IColor BaseContent
{
get { return Content; }
set { Content = (Color2) value; }
}
}
Теперь, в методе Main
, вы можете сделать это:
var baseColor = new Color1() { ColorDescription = "Red" };
var baseShape = new Shape1() { BaseContent = baseColor };
Другой вариант вместо введения нового свойства - это неявная реализация интерфейса IShape
- но это будет более громоздким и не позволит использовать синтаксис new Shape1() {Content = baseColor}
. Тем не менее, давайте рассмотрим эту опцию:
Итак, мы переименуем свойство BaseContent
в интерфейсе IShape
:
interface IShape { IColor Content { get; set; } }
И мы реализуем это так:
public partial class Shape1 : IShape
{
IColor IShape.Content
{
get { return ((Shape1)this).Content; }
set { ((Shape1)this).Content = (Color1) value; }
}
}
public partial class Shape2 : IShape
{
IColor IShape.Content
{
get { return ((Shape2)this).Content; }
set { ((Shape2)this).Content = (Color2) value; }
}
}
Затем мы создаем наши почитания так:
var baseColor = new Color1() { ColorDescription = "Red" };
// Note: Do not use var here - you need the reference to be of type `IShape`!
IShape baseShape = new Shape1();
baseShape.Content = baseColor;