2016-08-20 25 views
1

私は2つのクラスを持っています。 1つはデータと動作を含んでいます。もう一つは、データの入力と表示用です。あるクラスのメソッドを別のクラスから呼び出すと、結果が表示されます。これはゼロを返します。あるクラスから別のクラスへのメソッドの呼び出し?

すべてのヘルプ...おかげ

データと行動:

class CalculateArea 
{ 
    private const double PI = 3.14; 
    private double cirArea; 
    private double recArea; 
    private double cilArea; 
    private double radius; 
    private double length, width; 
    private int height; 

    // Constructors 
    public CalculateArea(double radius1) 
    { 
     radius = radius1; 
    } 
    public double CalculateCircleArea() 
    { 
     cirArea = (PI * (radius * radius)); 
     return cirArea; 
    } 

    public CalculateArea(int height1) 
    { 
     height = height1; 
    } 

    public CalculateArea(double lenght1 , double width1) 
    { 
     length = lenght1; 
     width = width1; 

    } 

    //public CalculateArea() 
    //{ 
     // TODO: Complete member initialization 
    //} 

    // methods 


    // 
    public double CalculateRectangleArea() 
    { 
     recArea = (length * width); 
     return recArea; 
    } 
    // 
    public double CalculateCylinderArea() 
    { 
     cilArea = (PI * (radius * radius) * height); 
     return cilArea; 
    } 
} 

入力と表示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string number; 
     Console.WriteLine("Which figure do you want to see calculated select a number"); 
     Console.WriteLine("Circle : 1"); 
     Console.WriteLine("Rectangle : 2"); 
     Console.WriteLine("Cylinder : 3"); 

     number= Console.ReadLine(); 
     int numb=Convert.ToInt32(number); 

     if (numb == 1) 
     { 
      Console.WriteLine("Enter the radius for circle"); 
      string rad; 
      rad = Console.ReadLine(); 
      int radiusX = Convert.ToInt32(rad); 
      CalculateArea newCal1 = new CalculateArea(radiusX); 
      Console.WriteLine("The result of calculation is {0}", newCal1.CalculateCircleArea()); 
     } 

     else if(numb == 2) 
     { 
      Console.WriteLine("Enter the length "); 
      number = Console.ReadLine(); 
      double lenght; 
      lenght = Convert.ToDouble(number); 
      Console.WriteLine("Enter the width "); 
      number = Console.ReadLine(); 
      double width; 
      width = Convert.ToDouble(number); 
      CalculateArea newCal2=new CalculateArea(lenght , width); 
      Console.WriteLine("The result of calculation is {0}" , newCal2.CalculateRectangleArea()); 
     } 

     else if (numb == 3) 
     { 
      Console.WriteLine("Enter the height "); 
      number = Console.ReadLine(); 
      int height; 
      height = Convert.ToInt32(number); 
      Console.WriteLine("Enter the radius"); 
      number = Console.ReadLine(); 
      int radius; 
      radius = Convert.ToInt32(number); 
      CalculateArea newCal3 = new CalculateArea(height, radius); 
      Console.WriteLine("The reslut of calculation is {0}", newCal3.CalculateCylinderArea()); 
     } 

     else 
     { 
      Console.WriteLine("There is no any calculation number check the information and try again"); 
     } 

     Console.ReadLine(); 

    } 
+0

何が問題になっていますか? – eurotrash

+0

計算結果を返したいときは0を返します。 – jawed

+0

計算結果 – jawed

答えて

2

次のコード:

CalculateArea newCal1 = new CalculateArea(radiusX); 

が呼んでいます次のコンストラクタ:

public CalculateArea(int height1) 
{ 
    height = height1; 
} 

radiusXはINTEGERですので...だから

は、値が高さではなく、半径に格納されます。 したがって、円の面積を計算するためにメソッドを呼び出すと、radiusを使用して計算されます。これはまだ0.0です。

CalculateCylinderAreaも半径と高さを使用していますが、コンストラクタは高さと幅の2つのパラメータしか取っていません。 したがって、方法3では、半径と幅が0.0のため「失敗」します。

矩形の計算が機能します。

円の問題を解決するには、raiusX変数をdoubleに変更する必要があります。

たとえば、シリンダの問題を解決するには、半径と高さの代わりに長さと幅を使用するようにルーチンを変更することができます。

しかし、サイドノートとして、あなたはJauchの答え@私はいくつかの追加情報を提供したいもののほか:)

+0

この方法だけでなく、すべての方法でこの問題が発生します – jawed

+0

私の更新答えを見てください。メソッド1と3だけが失敗します。方法2は必要に応じて動作します。 – Jauch

+0

それは問題だったし、私は貸してくれてくれてありがとう。 – jawed

0

をやろうとしているものを行うには良い方法がまだあります。

型(クラスまたは構造体)内のいくつかのメソッドが同じ名前を持つ場合、それらはオーバーロードされていると言われます。これは、仮パラメータリストが異なる場合にのみ許可されます。パラメータの名前は重要ではありません。彼らの番号とその種類だけです。戻り値の型も重要ではありません。

問題はOverload resolutionと関係があります。これは、どのオーバーロードされたバージョンを呼び出さなければならないかを理解するためにC#が行うことです。これは、実行時ではなく、コンパイル時に発生することを理解することが重要です。暗黙のうちに渡された具体的な値は、コンパイル時には知られていないので問題ではありません。実際の引数の型だけが重要です。

仕様については上記のリンクをたどってください。ただし、Jon Skeetの記事はおそらくより消化可能です:C# in Depth: Overloading

関連する問題