2016-05-24 9 views
1

異なるディメンションとジオメトリフラグに基づいてジオメトリを作成して、キューブまたは円であるかどうかを確認します。これを行うには、オーバーロード関数を使用する必要がありますが、私は入力を格納するためにこれらをクラス関数でどのように利用できるのか分かりません。ここで私はこれまでやったことです:私が持っているコンストラクタでCのオーバーロード関数を使用する方法#

public void Object(double x, double y, double z) 
     { 
      name = "Cube"; 
      a = x; 
      b = y; 
      c = z; 
     } 
     public void Object(double r, double y) 
     { 
      name = "Cylinder"; 
      r1 = r; 
      b = y; 

     } 

    protected double a{ get; private set; } 
    protected double b{ get; private set; } 
    protected double c{ get; private set; } 
    protected double r1{ get; private set; } 

最初の問題は、このケースでは、私はできない、私はそれぞれの可能なオブジェクトの変数を宣言する必要があり、私は宣言された変数を複数回使用することはできませんbに2つの変数を保存します。これはちょっと無効です。

私はそれが動作しません。他の値と一緒にこのような私のデータクラスのオブジェクトを呼び出したい場合は私の第二の問題はされています

public MeasureObject(double hash, string name, new Object obj(int n, different variables), double coordinates, ...) 

{ 
this.Hash = hash; 
this.Object=obj; 
} 

どのオブジェクトでの一般的な形状を実現するためのより良い方法はあります整数とnの異なる次元、長さを取ることができますか?

+2

オブジェクトが異なる場合は、それらを別々のクラスで処理する必要があります。ジェネリックスは、同じ方法で異なるタイプで動作するコードに使用する必要があります。 –

答えて

2

幾何学的オブジェクトは、それらの間に十分な違いがあるので、別々のクラスを持つ方がよいでしょう。

たとえば、それぞれの音量を計算する方法は異なります。

1つの解決策は、継承する基底クラスを持つことができ、フラグに基づいて必要な幾何学的オブジェクトインスタンスを決定するファクトリクラスを持つことができます。

+0

私はそれが正しいことを認めます。しかし、私はどのようにしてそのようなクラスを利用し、入力を一般的に保つことができますか?たとえば、対応するジオメトリの整数フラグとx値を与える関数のみを使用しますか? – DerBenutzer

+1

@DerBenutzer正確に何が問題になるでしょうか?あるケースでは、Object first_object = Cube(1,2,3)を使用し、別の場合はObject second_object = Cylinder(4,5)を使用します。オブジェクトよりもはるかに読みやすいthird_object(1,2,3)// <<はキューブを生成します。 – Aziuth

+0

ジオメトリがデータベースから読み取られるため、これは不可能です。そのような10000の入力があり、彼らはcube()またはcylinder()を呼び出す必要があるかどうかを知るべきです。特定のメソッドを呼び出すためのフラグが必要です。 – DerBenutzer

1

私はCubeとCylinderクラスと抽象クラスのGeometryを作成します。次に、両方のクラスで等しいメソッドを抽象クラスに置き、他のクラスをオーバーライドすることができます。

public abstract class Shape 
    { 
     public int Height; 
     public int Width; 
     public int Depth; 
     public double Area() 
     { 
      return Height * Width; 
     } 
     public abstract double Volume(); 
    } 
    class Square : Shape 
    { 
     public Square(int height, int width) 
     { 
      Height = height; 
      Width = width;    
     } 
     public override double Volume() 
     { 
      throw new NotImplementedException(); 
     }    
    } 
    class Cube : Shape 
    { 
     public Cube(int height, int width, int depth) 
     { 
      Height = height; 
      Width = width;   
      Depth = depth;  
     } 
     public override double Volume() 
     { 
      return Height * Width * Depth; 
     }    
    } 
1

私はこの方法で私のクラスを設計します:

namespace Geometry 
{ 
    public interface IMeasurableSolid 
    { 
     double CalcSurface(); 
     double CalcVolume(); 
    } 

    public class Sphere : IMeasurableSolid 
    { 
     public double Radius { get; set; } 

     public Sphere(double radius) 
     { 
      if (radius <= 0) 
      { 
       throw new ArgumentOutOfRangeException("radius", "value must be positive"); 
      } 
      this.Radius = radius; 
     } 

     public double CalcSurface() 
     { 
      return (Math.PI * 4 * Math.Pow(this.Radius, 2)); 
     } 

     public double CalcVolume() 
     { 
      return (Math.PI * 4 * Math.Pow(this.Radius, 3)/3); 
     } 
    } 

    public class Cylinder : IMeasurableSolid 
    { 
     public double Height { get; set; } 
     public double Radius { get; set; } 

     public Cylinder(double height, double radius) 
     { 
      if (height <= 0) 
      { 
       throw new ArgumentOutOfRangeException("height", "value must be positive"); 
      } 
      if (radius <= 0) 
      { 
       throw new ArgumentOutOfRangeException("radius", "value must be positive"); 
      } 
      this.Height = height; 
      this.Radius = radius; 
     } 

     public double CalcSurface() 
     { 
      return 2 * Math.PI * this.Radius * (this.Radius + this.Height); 
     } 

     public double CalcVolume() 
     { 
      return this.Height * Math.PI * Math.Pow(this.Radius, 2); 
     } 
    } 
} 

マールテンゼーマンが示唆されているようにあなたも、基本抽象クラスからSphereCylinderを導き出すことができます。私はもっ​​と多目的なソリューションだと思うので、私はインタフェースを使う方が好きです。 とにかくあなたがやることにしたら、いくつかのベストプラクティス(ここにいくつかの例があります:https://www.roberthalf.com/technology/blog/4-best-practices-for-microsoft-net-framework-and-applications)に従うことを提案してください。

  • Objectを呼び出すことを避けてください。それは危険な名前です。簡単なミスタイプによって、objectと混同することがあります。 GeometryまたはSolidとしてください。
  • 明示的なプロパティ名と大文字を選択します(高さ、長さ、幅はa、b、cより優れています)。

あなたが表現したいと思う現実にできるだけ近づけてください。あなたのクラスを適切に設計して維持することは、より簡単になります。

関連する問題