2014-01-26 2 views
0

Возможно ли, чтобы метод из общего класса вел себя совершенно по-разному для определенного типа?Специальный случай в методе общего класса C#

class MyClass<T> { 
    public void myMethod(T t) { // Do something } 

    // something for myMethod(int t) { // DO something special } 
} 

В таким образом, что позволяет мне называть (new MyClass<String>()).myMethod(myString), который будет делать что-то, а также позвонить (new MyClass<int>()).myMethod(myInt), который будет делать что-то особенное.

ответ

4

Я думаю, вам будет лучше использовать перегрузки для этого, а не generics.

Например:

public void myMethod(int t) 
{ 
} 

public void myMethod(string t) 
{ 
} 

Вы можете сделать проверку типа в дженериков, но это не лучшая практика.

На основе вашего редактирования и ОБСУЖДЕНИЯ, я считаю, что это то, что вы хотите:

class Program 
{ 
    static void Main(string[] args) 
    { 
     IntClass c1 = new IntClass(); 
     c1.MyMethod(12); 

     BaseClass<string> c2 = new BaseClass<string>(); 
     c2.MyMethod("hello world"); 
    } 
} 

class BaseClass<T> 
{ 
    public virtual void MyMethod(T t) 
    { 
     Console.WriteLine(string.Format("Param: {0}", t)); 
    } 
} 

class IntClass : BaseClass<int> 
{ 
    public override void MyMethod(int myVar) 
    { 
     Console.WriteLine(string.Format("Param: int")); 
    } 
} 
+0

У меня есть вопрос, потому что класс является общим, метод - нет. Все это работает? –

+0

Да, потому что независимо от типа, который вы передаете классу, вы по-прежнему используете соответствующую перегрузку. То есть, это тот же класс, независимо от того, какой тип вы передаете ему. –

+0

Но это вводит новый метод, который я не хочу. Я имею в виду, если у меня есть 'MyClass c' я не хочу, чтобы люди могли называть 'c.mymethod (myInt)' –

0

Просто используйте необщую перегрузку методы:

public void myMethod(int t) { // Special case for integer argument } 
public void myMethod<T>(T t) { // Generic method for everything else } 
+0

У меня есть вопрос о том, что класс является общим, а метод - нет. Все это работает? Кроме того, это вводит новый метод, который я не хочу. Я имею в виду, если у меня есть 'MyClass c' я не хочу, чтобы люди могли называть 'c.mymethod (myInt)' –

+0

@Trollkemada: Нет, потому что вы можете называть 'MyClass .myMethod (3)', что очевидно неправильно. C# не поддерживает специализацию общих классов, поэтому либо вы должны вернуться к чертежной доске, либо метод должен быть общим. Конечно, вы также можете сделать 'if (typeof (T) == typeof (int))'. – Jon

1

Идите вперед и оба перегруженных ,

public void myMethod(T t) { ... } 

и

public void myMethod(int t) { ... } 

Оба метода являются общими, но один использует класс T.

Если вы строите

MyClass<int> 

подписи двух методов Виль объединить. Это то, чего вы боитесь?

Звонок (new MyClass<int>()).myMethod(42); переходит ко второй перегрузке.


Возможно, я неправильно понял ваш вопрос. Вы хотите только один метод? Что именно вы хотите сделать специальным в случае int. Вы можете сделать код как:

public void myMethod(T t) 
{ 
    // do something 

    if (typeof(T) == typeof(int)) 
    { 
    // special case 
    // if you need t as an int, you can use the ugly (int)(object)t 
    } 

} 

Вы можете также рассмотреть вопрос о написании конкретного класса для int случая. Этот класс может быть получен из общего класса (ваш метод может быть сделан virtual).

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