-3

私は次のベローを持っています。

コンパイラは、変数がコンストラクターにある場合にのみ、派生クラスの変数 flyBehaviour を認識します。何故ですか?

abstract class Duck
{
    protected IFlyBehaviour flyBehaviour;

    public IFlyBehaviour FlyBehaviour
    {
        get
        {return flyBehaviour;}
        set
        {flyBehaviour=value;}
    }

}

class MullardDuck: Duck
{
    flyBehaviour  //the compiler doesn't recognize this variable here
    public MullardDuck()
    {
        flyBehaviour = new FlyWithWings(); //here the compiler recognize this variable
    }
}
4

3 に答える 3

1

これは単なる構文エラーであり、継承によるものではありません。

あなたもこれを書くことができませんでした:

abstract class Duck
{
    protected IFlyBehaviour flyBehaviour;
    flyBehaviour = ... ; // This wouldn't compile.

    public IFlyBehaviour FlyBehaviour
    {
        get
        {return flyBehaviour;}
        set
        {flyBehaviour=value;}
    }
}

flyBehaviourを呼び出すことで、既に定義されているが基底クラスにある保護されたフィールドを呼び出します。

そのフィールドを初期化する場合は、コンストラクターで行う必要があります。そうしないと、任意のメソッドまたはプロパティで値を操作できます。

class MullardDuck: Duck
{
    public MullardDuck()
    {
        // You can access the field from the constructor
        this.flyBehaviour = new FlyWithWings();
    }

    public void Method(){
        // You can also access the field from a method
        this.flyBehaviour = new FlyWithWings();
    }
}
于 2012-10-07T13:42:03.437 に答える
0

なぜその場所でその変数を使用する必要があるのですか? この場所でvarが認識されていると言ったら、このようなことしかできませんか?

class MullardDuck: Duck
{
    IFlyBehaviour mullardFlyBehaviour;
    public MullardDuck(){
        mullardFlyBehaviour = flyBehaviour;
    }
}
于 2012-10-07T13:38:01.193 に答える
0

派生クラスのメソッドで変数にアクセスできます。MullarDuck() 関数 (コンストラクター) または派生クラスで定義する可能性のあるその他の関数で変数にアクセスしてみてください。定義によると、派生クラスには既にこの変数があるため、メソッドまたはプロパティの外部でその変数にアクセスする必要はありません。

この変数に値を割り当てたい場合は、メソッドまたはプロパティで割り当てる必要があります。

于 2012-10-07T13:38:19.770 に答える