2011-06-29 7 views
1

さてさて、私は現在勉強相続、と私は何かをやった、これはコードです私はできませんarr.Average() エラーは言う:Error 1 'ConsoleApplication1.array.arr' is inaccessible due to its protection level C:\Users\x\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 35 20 ConsoleApplication1 誰かが私は間違っていると私に教えてくれる? ヘルパーに感謝します!継承運動

+0

その他が説明した問題(その編曲:プライベートですが)誰も尋ねることがありませんでした:なぜあなたの最初の継承は整数配列のラッパーですか?システムに組み込まれていないものをモデリングしてみてください。あなたはもっと多くを学ぶでしょう。がんばろう! – dlev

答えて

6

可視性の種類を指定していないため、arrはプライベートとして宣言されています。それをprotectedに変更すると、サブクラスのarray2がそのクラスにアクセスできるようになります。

protected int [] arr; 
-2

は、パブリックまたはARR変数に保護された追加:

public int [] arr; 
protected int [] arr; 

特に指定しない場合、コンパイラはあなたの宣言がプライベート作りにデフォルト設定されます。

+0

ああそう!しかし、私はこのようにするのが良いでしょう: –

+0

protected int [] arr;右? –

+0

は代わりにprotectedを使用しているため、サブクラスのみがアクセスできます。他のクラスは、変数にアクセスするためにアクセサを使用する必要があります。 – Bart

0

arrのアクセスタイプを明示的に定義していないため、暗黙的にprivateに設定されています。派生クラスからこれをアクセスできるようにするには、それをprotectedに設定する必要があります。

protected int [] arr; 

これを行うより良い方法があります。それは一般的な考えです。

+0

@George Duckett修正をありがとう!私が何かを書くのが遅すぎる! ;) – csano

0

C#では、クラスメンバの既定のアクセスレベルはprivateです。 int [] arrのアクセスレベルを指定していないため、privateであり、他のクラスからアクセス可能です。

0

これは、arrフィールドがプライベートであるためです。このように、代わりに書き込みプライベート読み取り保護されたプロパティを使用することを検討してください:あなたの例では

class array 
{ 
    protected int[] arr {get; private set; } 
    public array(int[] arr) 
    { 
     this.arr = arr; 
    } 
    public int Biggest() 
    { 
     return arr.Max(); 
    } 
    public int Min() 
    { 
     return arr.Min(); 
    } 
    public int SumArr() 
    { 
     return arr.Sum(); 
    } 
} 
class array2 : array 
{ 
    public array2(int [] arr):base(arr) 
    { 
    } 
    public double Average() 
    { 
     return arr.Average(); 
    } 
} 
1

、あなたが修飾子自体を省略しているimplictly privatearr配列を作りました。あなたがへのアクセスを提供したい場合は、あなたの派生クラスでfield、あなたがprotectedのアクセス修飾子を使用する必要があるだろうと述べた。

protected int[] arr; 

しかしフィールドが本当にあるべきように、フィールドをこのように公開することをお勧めしていませんプライベートクラス状態。あなたは何をすべきか、プロパティを経由して、そのフィールドへの読み取り専用アクセスをカプセル化である:あなたの派生クラスで意味

protected int[] Array { 
    get { return this.arr; } 
} 

、次のことができます。

public double Average() 
{ 
    return this.Array.Average(); 
} 
+0

このように?:protected int [] arr; protected int []配列 { を取得します。 { return this.arr; } } –

+0

全体のポイントはこれだけのエクササイズです。あなたは1つの "推奨されない"練習(フィールドを直接公開しない)を別のものと置き換えようとしています。読み込み専用のプロパティの背後にあるフィールドを「隠していても」、あなたはまだ配列*を返していますが、これはとにかく変更可能です*。 – dlev

+0

確かに、近い将来にこれらのことを知りたいのですが、これが大丈夫かどうかを知りたがっていますか? –