1

C#でオブジェクト指向の原則を適切に適用する方法を学んでいます。私は小さな問題に遭遇しました、そして私はそれを解決する方法を理解することができません。私は次の問題に遭遇します:

現状:

public abstract class Foo
{
    protected Foo()
    {
        //does nothing
    }
}

public class Bar : Foo
{
    public BarX ( int a, int b, int c) : base()
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public doStuff()
    {
        //does stuff
    }
}

public class BarY : Foo
{
    public Bar( int a, int b, int c) : base()
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public doStuff()
    {
        //does stuff
    }
}

重要なのは、私はさまざまな種類のを持っているということですFoo。この場合、それは円と長方形になります。各タイプが同じ属性を持っているので、それらに同じコンストラクターを持たせたいです。彼らは異なるdoStuff()方法しか持っていません。私は多くの組み合わせを試しましたが、引数を基本クラスのコンストラクターに移動しようとするたびに、コードの移動方法に応じて、「一部のクラスには0個の引数(または3個の引数)を取るコンストラクターが含まれていない」と表示されます。

私の質問は、a、b、cの値の割り当てを抽象クラスのコンストラクターに移動する方法です。

4

2 に答える 2

1

以下が機能します。

public abstract class Foo
{
    protected Foo(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public abstract void doStuff();
}

public class Bar : Foo
{
    public Bar(int a, int b, int c) : base(a, b, c)
    {
    }

    public override void doStuff()
    {
        //does stuff
    }
}


public class BarY : Foo
{
    public BarY(int a, int b, int c) : base(a, b, c)
    {
    }

    public override void doStuff()
    {
        //does stuff
    }
}
于 2012-12-10T14:00:46.837 に答える
1

これは、パラメーター化されたコンストラクターしかない場合に、基本クラスに存在しないデフォルトのコンストラクター()を呼び出しているBarYためです。引数も渡す必要があります():BarXbase()base(a, b, c)

public abstract class Foo
{
    protected Foo(int a, int b, int c) 
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public abstract void doStuff();
}

public class Bar : Foo
{
    public BarX (int a, int b, int c) : base(a, b, c)
    {

    }

    public override void doStuff()
    {
        //does stuff
    }
}

public class BarY : Foo
{
    public Bar(int a, int b, int c) : base(a, b, c)
    {

    }

    public override void doStuff()
    {
        //does stuff
    }
}
于 2012-12-10T14:01:38.560 に答える