2012-03-03 3 views
2

Я совершенно не знаком с C# generic, поэтому у меня есть следующая проблема. У меня 2 класса. Один экземпляр и другой общий класс. Я хочу иметь свойство в 1-м классе типа 2-го родового класса.Как создать общий класс свойства в другом классе экземпляра?

что-то на этих строках .... функциональность мудрая.

public class SampleClass 
{ 
    private SampleGenericClass<T> sampleClass; 

    public SampleClass(string name, int age, string version) 
    { 
    if(version == "1.0") 
    { 
     this.sampleClass = new SampleGenericClass<int>(name, age); 
    } 
    else 
    { 
     this.sampleClass = new SampleGenericClass<long>(name.age); 
    } 
    } 

    public void Load() 
    { 
    this.sampleClass.Load(); 
    } 
    public void Open() 
    { 
    this.sampleClass.Open(); 
    } 
    public void Close() 
    { 
    this.sampleClass.Close(); 
    } 
} 

Мой второй общий класс что-то вроде этого

internal class SampleGenericClass<T> where T : class 
    { 
    private string name; 
    private string age; 

    public SampleGenericClass(string name, int age) 
    { 
     this.name = name; 
     this.age = age; 
    } 

    public void Load() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // load int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // load long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    } 
    public void Open() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // open int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // open long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    } 

    public void Close() 
    { 
     // Do something based on type 
     if(typeof(T) == typeof(int)) 
     { 
     // close int type 
     } 
     else if(typeof(T) == typeof (long)) 
     { 
     // close long type 
     } 
     else 
     { 
     throw new ArgumentException("Un supported type"); 
     } 
    }  

    } 

Теперь я понимаю, что поддержка CLR оленья кожа общие свойства или конструкторами. Итак, как я могу решить эту проблему? Я все еще хочу иметь общий класс и каким-то образом создавать его в своем 2-м классе на основе параметров, переданных конструктору 1-го класса, чтобы вызвать загрузку методов openm, закрыть во втором классе.

Благодарим за помощь.

ПРИМЕЧАНИЕ: Я знаю, что приведенный выше код не компилируется, bcoz CLR не поддерживает общие свойства и конструкторы. Это только для иллюстративных целей, что я хочу, чтобы достичь концептуально

+0

У вас есть поток дизайна в вашей программе. Если вы знаете типы, которые собираетесь использовать ('int' и' long'), просто перейдите для создания абстрактного класса с двумя реализациями, который принимает 'int', а другой возьмет 'long' – GETah

ответ

2

ИМО вы должны решить, в верхнем уровне, что тип SampleClass На самом деле вы должны определить его как родовое:

public class SampleClass<T> where T : .... 
{ 
    private SampleGenericClass<T> sampleClass; 

    public SampleClass(string name, int age, string version) 
    { 
     this.sampleClass = new SampleGenericClass<T>(name, age); 
    } 

    public void Load() 
    { 
    this.sampleClass.Load(); 
    } 
} 

и создать SampleClass базовую версию на верхних уровнях (и родственный общий).

например:

Основной метод:

if (version == "1") 
{ 
    DoAction<int>(); 
} 
else 
    DoAction<long>(); 

..... 
void DoAction<T>() 
{ 
    SampleClass<T> s = new SampleClass<T>(...) 
} 

Кроме того, как я могу видеть, что вам не нужен тип T для переменных-членов, так что вы можете перенести его на более низкий уровень в вызовах функций.

+0

, это должно спасибо за работу – user330612

2

Либо объявить конкретный тип

public class SampleClass { 
    private SampleGenericClass<int> sampleClass; 
    ... 
} 

или добавить параметр универсального типа для SampleClass

public class SampleClass<T> where T : class { 
    private SampleGenericClass<T> sampleClass; 
    ... 
} 
1

Интерфейс:

public interface ISampleGenericClass 
    { 
     void Load(); 
     void Open(); 
     void Close(); 
    } 

Общий класс реализует это:

internal class SampleGenericClass<T> : ISampleGenericClass 
{ 
    ... 
} 

И SampleClass

public class SampleClass 
{ 
    private ISampleGenericClass sampleClass; 
.... 
} 

Я снял ограничение класса, так как INT и длинные типы значений, поэтому они не могут быть использованы в текущей форме.

Смежные вопросы