2016-10-18 17 views
0

私はジェネリックメソッドを初めて使うことができますか?私は答えを探してきましたが、あなたが助けることができる1つの希望を見つけることができません。 私はボクシングとアンボクシングを試みましたが、それはエラーです。 ここに私のコードです。一般的なメソッド設定値T

  if (input == 1) 
     { 
      Sum sum = new Sum(); 
      InputTwoDegits<Sum>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, sum); 
      factoryClass = sum; 
      factoryClass.Compute(); 
     } 
     else if (input == 2) 
     { 
      Difference dif = new Difference(); 
      InputTwoDegits<Difference>(out firstNumber, out secondNumber, out firstNumberChecker, out secondNumberChecker, input, dif); 
      factoryClass = dif; 
      factoryClass.Compute(); 
     } 

    private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : class 
    { 
     T set = T(Sum); 
     firstNumberChecker = Int32.TryParse(Console.ReadLine(), out firstNumber); 
     //returnClass.FirstNumber = firstNumberChecker ? input : 0; 
     secondNumberChecker = Int32.TryParse(Console.ReadLine(), out secondNumber); 
     //returnClass.SecondNumber = secondNumberChecker ? input : 0; 
    } 



public abstract class BaseClass 
{ 
    public BaseClass() 
    { 
     this.Compute(); 
    } 

    public int FirstNumber { get; set; } 
    public int SecondNumber { get; set; } 
    public int ReturnObj { get; set; } 

    public abstract void Compute(); 
} 
public class Sum : BaseClass 
{ 
    public override void Compute() 
    { 
     ReturnObj = FirstNumber + SecondNumber; 
    } 
} 

    public class Difference : BaseClass 
    { 
     public override void Compute() 
     { 
      ReturnObj = FirstNumber - SecondNumber; 
     } 
    } 

コメントコードに誤りがあります。私はそれに値を入れることができるように、returnClassの値を設定したいと思います。

ありがとうございました。

答えて

1

Tがクラスであると指定しても、クラスの特性は定義されていないため、エラーです。

interface ISomeNumbers 
{ 
    int FirstNumber{get; set;} 
    int SecondNumber{get; set;} 
} 

そして、あなたのタイプがあります。しかし、あなたのコードでは、あなたがT.

一つの方法として、この周り

のインスタンスにFirstNumberSecondNumberを設定できるように期待しているそれらのプロパティとのインタフェースを定義することですインターフェイスを実装します。さて、あなたはこの方法で、一般的な制約を指定することができます。

private static void InputTwoDegits<T>(out int firstNumber, out int secondNumber, out bool firstNumberChecker, out bool secondNumberChecker, int input, T returnClass) where T : ISomeNumbers 

今、あなたはあなたがTのインスタンス上で行うことができるように期待コンパイラを告げてきたようにプロパティを設定できるようになります。

+0

私はこれもまた、作業のおかげ – whizzle

+0

@whizzleを試してみました - あなたは受け入れとして、あなたがそれを常にマークすることができるよりも答えに満足している場合。 – Sean

0

あなたはこの方法を変更する必要があります。それは何かを返すように、また、あなたは、このメソッドのシグネチャを変更する場合があります

private static void InputTwoDegits<T>(
    out int firstNumber, 
    out int secondNumber, 
    out bool firstNumberChecker, 
    out bool secondNumberChecker, 
    int input, 
    T returnClass) where T : BaseClass // <---- constraint on BaseClass instead of Class 

public override void Compute() 
{ 
    ReturnObj = FirstNumber + SecondNumber; 
} 
+0

ありがとうございますこれは動作する可能性があります。 – whizzle

関連する問題