Дано: вот такая иерархия наследования
public interface INativeResourceHolder [ +T ] where T : INativeResource
{
Resource : T
{
get;
set;
}
}
public class NativeResourceHolder [ T ] : PresentationObject, INativeResourceHolder [ T ] where T : INativeResource
{
protected Resource : T implements INativeResourceHolder [ T ].Resource
{
get;
private set;
}
}
public interface INativeBrush : INativeResource
{
Opacity : float
{
get;
set;
}
Transform : Matrix
{
get;
set;
}
}
public interface INativeSolidColorBrush : INativeBrush
{
Color : Color
{
get;
set;
}
}
public abstract class Brush [ T ] : NativeResourceHolder [ T ] where T : INativeBrush
{
private mutable opacity : float;
private mutable transform : Matrix;
public Opacity : float
{
get { opacity }
set
{
opacity = value;
when ( Resource : object != null )
Resource.Opacity = value;
}
}
public Transform : Matrix
{
get { transform }
set
{
transform = value;
when ( Resource : object != null )
Resource.Transform = value;
}
}
}
public class SolidColorBrush : Brush [ INativeSolidColorBrush ]
{
private mutable color : Color;
public this ( color : Color )
{
this.color = color;
}
public Color : Color
{
get { color }
set
{
color = value;
when ( Resource != null )
Resource.Color = value;
}
}
}
public class RoundedRectangle : Visual
{
public Background : Brush [ INativeBrush ]
{
get;
set;
}
}
Хочется сделать так:
def root = RoundedRectangle ( );
root.Background = SolidColorBrush ( Colors.Aqua );
На что получаю ошибку:
expected Workspace.Presentation.Brush[Workspace.Presentation.INativeBrush], got Workspace.Presentation.SolidColorBrush in assigned value: the types Workspace.Presentation.INativeSolidColorBrush and Workspace.Presentation.INativeBrush are not compatible [simple unify]
Чо делать?
Здравствуйте, Visor2004, Вы писали:
V>Чо делать?
Мне кажется, Brush должен быть ковариантным (или контравариантным, не могу врубиться). Но это так, пальцем в небо, без тестирования.
Здравствуйте, Visor2004, Вы писали:
Выкрутился введя базовый интерфейс для кисти. Но не хотелось бы плодить интерфейсов, может кто-то придумает вариант с базовым классом?
public interface IBrush2 [ +T ] : INativeResourceHolder [ T ] where T : INativeBrush
{
Opacity : float
{
get;
set;
}
}
public class Brush2 [ T ] : NativeResourceHolder2 [ T ], IBrush2 [ T ] where T : INativeBrush
{
public Opacity : float
{
get;
set;
}
}
public class SolidColorBrush2 : Brush2 [ INativeSolidColorBrush ]//, IBrush2 [ INativeSolidColorBrush ]
{
}
module Test2
{
testp() : void
{
def solidBrush : IBrush2 [ INativeBrush ] = SolidColorBrush2 ( );
}
}
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, Visor2004, Вы писали:
V>>Чо делать?
C>Мне кажется, Brush должен быть ковариантным (или контравариантным, не могу врубиться). Но это так, пальцем в небо, без тестирования.
да, но вылазит ошибка, что класс не может иметь ковариантный параметр, только интерфейс...