Listy generyczne i obiektowość

0

Witam,

Dziś spotkałem się z pewnym kłopotem i chciałbym zapytać Was jak Wy byście to rozwiązali.

Załóżmy, że mamy klasę

public abstract class BaseDefinition
{
public int Id {get;set;}
public string Name {get;set;}
}

oraz klasę generyczną

public abstract class BaseObject
{
public string Name {get;set;}
public string Schema {get;set;}
}

public abstrac class BaseObject<T> : BaseObject where T : BaseDefinition
{
public IList<T> Objects {get;set;}
}

oraz klasy dziedziczące z nich

public class ClassADefintion : BaseDefinition
{
  public bool IsChanged {get;set;}
}

public class ClassAObject : BaseObject<ClassADefinition>
{
 public bool OtherField {get;set;}
}

public class ClassBDefintion : BaseDefinition
{
  public bool IsBBBChanged {get;set;}
}

public class ClassBObject : BaseObject<ClassBDefinition>
{
 public bool OtherBBBBField {get;set;}
}

Sorki za nazwy klas - ale to nie ma znaczenia w tym przypadku. Jak widać na razie jest wszystko w porządku.

teraz powiedzmy, że mamy 2 obiekty IEnumerable

IEnumerable<ClassBObject> ClassBObjectCollection;
IEnumerable<ClassAObject> ClassAObjectCollection;

i potrzebuję stworzyć metodę, która przyjmie obie te kolekcje, co oczywiście zrobiłem to

public void DoWork(IEnumerable<BaseObject<BaseDefinition>> objects)
{
foreach(var obj in objects)
{
foreach(var obj1 in obj.Objects)
{
// znów sory za nazwy, ale to tylko przykład, chodzi o ukazanie tego, że muszę iterować po obj.Objects
}
}
//crash
}

W tym momencie kłopot, dupa blada zbita :P Lekki zamęt w głowie i przypomniałem sobie, że dla generycznych klasy
BaseObject<BaseDefinition> != ClassAObject, mimo że kompilator przepuści taki schemat. Przypomniałem sobie również, że w .NET 4 doszła opcja out w interface dla takich sytuacji, no to co, piszemy interface

 
public interface IBaseObject<out T> where T : BaseDefinition
{
IList<T> Objects {get;set;}
}

nawet nie uda się w klasie abstrakcyjnej BaseObject zaimplementować IBaseObject, gdyż nie można stworzyć IList z out T

Ma ktoś jakieś pomysły na taką sytuację ?

Pozdrawiam

0

Nie chce mi się wgryzać w twój kod, bo nie programuję w C#, ale pewnie twój problem ma związek z kowariancją i kontrawariancją: http://msdn.microsoft.com/en-us/library/dd799517.aspx

1

Ma ktoś jakieś pomysły na taką sytuację ?
Przeprojektować aplikację, by nie była tak przekombinowana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1