2016-11-27 1 views
0

ポリモフィズム(Virtua &オーバーライドメソッド)を使用してさまざまな図形の領域を計算するコードを作成しましたが、正しい結果が得られません。 :(以下Poymorphismと仮想メソッドを使用してCalculateArea - 適切な結果を取得しません。

は私のコードです:長方形&トライアングルについては

class Program 
{ 
    static void Main(string[] args) 
    { 
     double side = 0; 
     double length = 0; 
     double width = 0; 
     double height = 0; 
     double baseoftriangle = 0; 
     double radius = 0; 

     UserChoice: 
     Console.WriteLine("For what shape you want to calculate the Area:\n1. Sqaure\n2. Rectangle\n3. Triangle\n4. Circle"); 
     Console.Write("Please Select the number from above options: "); 
     int choice = int.Parse(Console.ReadLine()); 



     switch (choice) 
     { 
      case 1: 
       Console.Write("Please enter the side of square: "); 
       side = double.Parse(Console.ReadLine()); 
       break; 
      case 2: 
       Console.Write("Please enter the length of rectangle: "); 
       length = double.Parse(Console.ReadLine()); 
       Console.Write("Please enter the width of rectangle: "); 
       width = double.Parse(Console.ReadLine()); 
       break; 
      case 3: 
       Console.Write("Please enter the height of triangle: "); 
       height = double.Parse(Console.ReadLine()); 
       Console.Write("Please enter the base of triangle: "); 
       baseoftriangle = double.Parse(Console.ReadLine()); 
       break; 
      case 4: 
       Console.Write("Please enter the radius of circle: "); 
       radius = double.Parse(Console.ReadLine()); 
       break; 
      default: 
       Console.WriteLine("Incorrect Choice, please try again!"); 
       goto UserChoice; 
     } 

     CalculateArea Sqa = new Square(); 
     Sqa = new Rectangle(); 
     Sqa = new Triangle(); 
     Sqa = new Circle(); 
     if (choice == 1) 
     { 
      Sqa.Area(side); 
      Sqa.ShowResult(); 
     } 
     else if(choice==2) 
     { 
      Sqa.Area(length,width); 
      Sqa.ShowResult(); 
     } 
     else if(choice==3) 
     { 
      Sqa.Area(height, baseoftriangle); 
      Sqa.ShowResult(); 
     } 
     else 
     { 
      Sqa.Area(radius); 
      Sqa.ShowResult(); 
     } 


     ChoiceOfAnotherCalculation: 
     Console.Write("\nDo you want to calculate area of any other shape? Give input in Yes or NO: "); 
     string choice1 = Console.ReadLine(); 

     switch (choice1.ToUpper()) 
     { 
      case "YES": 
       goto UserChoice; 
      case "NO": 
       break; 
      default: 
       Console.WriteLine("Incorrect Choice, please try again!"); 
       goto ChoiceOfAnotherCalculation; 
     } 
    } 
} 
class CalculateArea 
{ 
    public double result; 
    public virtual void Area(double side) 
    { 
    } 
    public virtual void Area(double length, double width) 
    { 
    } 
    public void ShowResult() 
    { 
     Console.WriteLine($"Your Result is {result}"); 
    } 
} 
class Square: CalculateArea 
{ 

    public override void Area(double side) 
    { 
     result = side * side; 
    } 

} 
class Rectangle:CalculateArea 
{ 
    public override void Area(double length, double width) 
    { 
     result = length * width; 
    } 
} 
class Triangle:CalculateArea 
{ 
    public override void Area(double height, double baseoftriangle) 
    { 
     result = (height * baseoftriangle)/2; 
    } 
} 
class Circle:CalculateArea 
{ 
    public override void Area(double radius) 
    { 
     result = 3.14159 * radius * radius; 
    } 
} 

、私は常に、結果として0を取得していますし、正方形のために、私はサークルから結果を取得しています、私はこの問題が原因で発生していると思います。私は(理由は多型で理解不足であってもよい)クラスのオブジェクトを作成している。

誰かが見ていると私は、実際の問題がここにあるものを知って聞かせていただけます。

これとは別にまた、私はような方法感謝するあなたが私に解決策を提供できるかどうかの努力は、各クラスのプロパティを&に設定してください。私はコードを書くことを試みました(それぞれのクラスでも基本クラスでもプロパティを定義しようとしていましたが)、私は上記の解決策に飛びついています。

私はまたシステムに私が長い間質問をすることを許可しないので質問をdownvote要求しないでください。これが私が物事を正しく理解できる唯一のプラットフォームなので。

多くのありがとうございます。

+0

switch文の上にある 'CalculateArea Sqa'宣言を動かしてください。 switchステートメントで、Sqaを適切なシェイプに割り当てます。 'if'ステートメントは、' Sqa'という形をしてその面積を計算するように要求するときに消えます。多態性とは、クラスに何かを依頼するときにswitch文(または同等のif..else if..else)を必要とせず、具体的なクラスに応じて異なる動作をします。基本クラスは 'CalculateArea'ではなく' Shape'と呼ばれるべきです - 一般的にメソッドのクラス、動詞には名詞を使います。それは抽象的でなければならない。 –

答えて

0

switchステートメントの場合、ケース1の後、プログラムは終了します。これはreturn;を使用したためです。代わりにbreak;を使用している可能性があります。 Breakステートメントは、スイッチが次のステートメントに進むことを確実にし、returnステートメントは実行を直ちに終了します。この

case 1: 
    Console.Write("Please enter the side of square: "); 
    side = int.Parse(Console.ReadLine()); 
    break; 

EDIT

基底クラスはクラスのみを継承して実装する必要があり面積を計算するための抽象メソッドを保持するように

正しい場合ステートメントがなければなりません。

public abstract class Shape 
{ 
    // must implement by inheriting classes 
    public abstract double CalculateArea(); 
} 

それぞれの図形は異なるパラメータを使用して面積を計算するため、その特定の図形に必要なプロパティを作成する必要があります。

public class Square : Shape 
{ 
    // properties differ based on the shape.. 
    // eg: triangle needs height and base 
    // edit CalculateArea method based on the shape 
    public double Length { get; set; } 

    public override double CalculateArea() 
    { 
     return Length * Length; 
    } 
} 

あなたが前に行ったよう、必要なパラメータを渡し形状のインスタンスを作成し、実装し、double値を返しますCalculateArea()方法、呼び出し:あなたのクラスが見えるはずです多型について

double length; 
Console.WriteLine("Enter length of one side: "); 
if (!double.TryParse(Console.ReadLine(), out length)) 
    Console.WriteLine("Invalid value, must be a number or decimal value."); 

Square sq = new Square(); 
sq.Length = length; 
Console.WriteLine(sq.CalculateArea().ToString("F")); 
+0

多くのありがとうAbdul、私はこれらの復帰と休憩の間に混乱しました。知らせてくれてありがとうございます。また、このコードを完成させるためにプロパティを使用する必要があるこのクエリを解決するのを手伝ってください。現在私はそれにプロパティを追加していません。 – Shan

+0

@Shanどのプロパティですか? 'Square'クラスで計算した後に値を格納する' result'プロパティがありますか? – abdul

+0

プロパティを参照して、ここではgetメソッドとsetメソッドを意味します。実際に私が望むのは、カプセル化を伴う多態性です。 私はユーザーからどんな値をとっても、結果を検証できるプロパティを通じてこれらの値をメソッドに送信します。 また、私は多態性を使用しているときに、クラスを生成する際にプロパティを使用できますか?もしそうなら、どのようにクラスオブジェクトを派生させて値をこれらのプロパティに移すことができますか? – Shan

0

をこのような:

abstract class Shape 
{ 
    public abstract double Area {get;} 
} 

class Square: Shape 
{ 
    public double Side {get;} 
    public override double Area => Side * Side; 
    public Square (double side) 
    { 
     this.Side = side; 
    } 
} 

class Rectangle:Shape 
{ 
    public double Width {get;} 
    public double Length {get;} 
    public override double Area => Width * Length; 
    public Rectangle (double width, double length) 
    { 
     this.Width = width; 
     this.Length = length; 
    } 
} 

など

これを使用すると、最初のcase文の間にShapeを1回作成してから、その出力で.Areaプロパティを使用できます。

あなたのシェイプクラスに出力するコードはありません。各クラスは1つのもの(SRP)に集中してください。

シェイプは、シェイプを記述するためにこれらのプロパティを使用する「説明」プロパティを後で追加する場合があるため、独自のプロパティを追跡する必要があります。

関連する問題