3

だから私はプログラミングにかなり慣れていないので、親クラスをチェックしてその型を見つけ、どちらの結果に対しても同じコードブロックを実行するメソッドを作成できるかどうかを確認しようとしています。基本的に、複数の異なる子クラスがある場合に長い if ステートメント、else if ステートメントを回避する方法があるかどうかを確認しようとしています。

たとえば、代わりに

public Class Shape
public Class Circle : Shape
public Class Rectangle : Shape
public Class Polygon : Shape
....

Shape shape;

if(shape.GetType() == typeof(Rectangle))
{
    var asRectangle = (Rectangle)shape;
    doSomething();
}
else if (shape.GetType() == typeof(Circle))
{
    var asCircle = (Circle)shape;
    doSameSomething();
}
else if (shape.GetType() == typeof(Polygon))
{
    var asPoly = (Polygon)shape;
    doSame();
}

次のようにします。

if (shape.GetType() == typeof(Rectangle)) var someShape = (Rectangle)shape;
else if (shape.GetType() == typeof(Circle)) var someShape = (Circle)shape;
else if (shape.GetType() == typeof(Polygon)) var someShape = (Polygon)shape;

method(someShape)
{
    doStuff...
}

上記のように var を宣言することも、単に行うこともできないことを私は知っています:

var dd;
if(something) var = whatever;

しかし、形を使って何かをする必要があるたびに、if、else if、else if、else if ステートメントを書かなくてもメソッドを再利用できる方法があるかどうか疑問に思っています。

4

3 に答える 3

3

基本クラスでメソッドをvirtualorとしてabstract宣言すると、オーバーライド キーワードを使用して派生クラスで再度宣言できます。これにより、オブジェクトを として扱い、Shape共通の関数を呼び出すことができますが、インスタンスが実際にどのクラスであるかに応じて適切なメソッドを呼び出すことができます。

public abstract class Shape
{
    public abstract void SayMyName();
}

public class Circle : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a circle!");
    }
}

public class Rectangle : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a rectangle!");
    }
}

public class Polygon : Shape
{
    public override void SayMyName()
    {
        Console.WriteLine("I'm a polygon!");
    }
}

次に、次のように消費できます。

List<Shape> shapes = new List<Shape>(new Shape[]
{
    new Circle(),
    new Rectangle(),
    new Polygon(),
});

foreach (Shape s in shapes)
    s.SayMyName();
于 2013-10-11T18:23:53.373 に答える
0

通常、メソッドをShapeクラスに移動して、それを呼び出すだけです。メソッドがvirtual(またはabstract) の場合、派生型の実際のバージョンが呼び出されます。

これにより、カスタマイズの必要に応じて 、 、 などでShapeデフォルトoverrideの実装を提供できる可能性があります。RectangleCirclePolygon

詳細については、MSDN の仮想メソッドを参照してください。

于 2013-10-11T18:20:15.850 に答える
0

実装ではなく、インターフェイスに対してプログラムします。

つまりShape、特定のクラス自体に対してではなく、基本クラス/インターフェイスに対して (主に) アクションを実行するようにコードを記述する必要があります。つまり、デフォルトでキャストするのではなく、必要に応じてキャストする必要があります。したがって、Shapeクラスをインターフェースとして実装すると、次のようになります。

abstract class Shape {
     public abstract Method() { ...}
}

キャストする必要はまったくありません。呼び出すだけでshape.Method()、すべての派生クラスで機能します。

また、これを行う方が簡単です:

if (shape is Polygon)

お電話shape.GetType()より

于 2013-10-11T18:21:01.050 に答える