не получается реализовать мост с помощью дженериков
От: Visor2004  
Дата: 12.01.12 10:04
Оценка:
Дано: вот такая иерархия наследования

  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]


Чо делать?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: не получается реализовать мост с помощью дженериков
От: catbert  
Дата: 12.01.12 10:27
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Чо делать?


Мне кажется, Brush должен быть ковариантным (или контравариантным, не могу врубиться). Но это так, пальцем в небо, без тестирования.
http://nemerle.org/banners/?t=%20catbert%20
Re: не получается реализовать мост с помощью дженериков
От: Visor2004  
Дата: 12.01.12 10:32
Оценка:
Здравствуйте, 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 ( );
    }
  }
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: не получается реализовать мост с помощью дженериков
От: Visor2004  
Дата: 12.01.12 10:33
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, Visor2004, Вы писали:


V>>Чо делать?


C>Мне кажется, Brush должен быть ковариантным (или контравариантным, не могу врубиться). Но это так, пальцем в небо, без тестирования.


да, но вылазит ошибка, что класс не может иметь ковариантный параметр, только интерфейс...
Помните!!! ваш говнокод кому-то предстоит разгребать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.