2008-10-22 3 views
3

Рассмотрим следующий код:Лучшая практика для сбора общих классов

abstract class SomeClassX<T> 
{ 
    // blah 
} 

class SomeClassY: SomeClassX<int> 
{ 
    // blah 
} 

class SomeClassZ: SomeClassX<long> 
{ 
    // blah 
} 

Я хочу коллекцию SomeClassX <T> «s, однако, это не представляется возможным, так как SomeClassX <INT> = SomeClassX! <long> и список < SomeClassX < > > не допускается.

Так что мое решение иметь SomeClassX <T> реализовать интерфейс и определить мою коллекцию, как, где ISomeClassX является интерфейс:

class CollectionOfSomeClassX: List<ISomeClassX> 
{ 
    // blah 
} 

Это лучший способ сделать это, или есть лучший способ ?

ответ

1

Я бы либо использовал интерфейс, который вы предложили, либо сделал SomeClassX наследуемым от другого класса. Это действительно зависит от того, что вам нужно делать с объектами в вашей коллекции. Независимо от того, какая функциональность они будут иметь вместе, следует использовать базовый класс или интерфейс, если это кажется более подходящим.

1

Ваш лучший вариант, как вы предложили, создать интерфейс ISomeClass и реализовать его. Недавно я решил эту же самую проблему с пользовательскими настройками и системой профилей, которые мы хотели использовать для хранения различных типов данных. Оно сводилось к:

public interface IEntry 
{ 
    // ... 
    object Value { get; set; } 
} 

Конкретная Entry<Single> может быть реализован так Entry<T> неявно реализован интерфейс:

public class Entry<T> : IEntry 
{ 
    T Value { get; set; } 
    object IEntry.Value { get { return Value; } set { return Value; } } 
} 

Но когда дело дошло до IDictionary<string,IEntry> времени мы вернулись к заливке IEntry экземпляров в Entry<T> соответствующий тип или значение Value, равное IEntry, соответствующему типу.

// assume entries is IDictionary<string,IEntry>... 
var entry = entries["pizza-weight"]; 
var weight = (float)entry.Value; 

Это, конечно, все это имеет смысл, потому что так же, как SomeClass<int>! = SomeClass<long> так верно IList<SomeClass<int>>! = IList<SomeClass<long>>.

+0

Я подумал об этом, но отбросил эту идею, так как при поступлении предметов требуется кастинг. Может также использовать старые System.Collections :-) – VirtualStaticVoid 2008-10-22 22:49:32