3

クラスAが基本クラスであり、AのクラスBサブクラス(クラスB:A)があるとします。次に、クラスC:Bがあります。

質問は、クラスAにメソッドがある場合、クラスCはそのメソッドを使用できますか?

4

4 に答える 4

2

はい、宣言されている場合は可能publicですprotected。しかし、そうではありませんprivate

@DavidLに感謝します。.の特殊なケースについて言及するのを忘れましたinternal

Visual Studioに付属のC#マニュアル(2012年版はこちら)から::

  • •継承は推移的です。CがBから派生し、BがAから派生している場合、CはBで宣言されたメンバーとAで宣言されたメンバーを継承します。•派生クラスは、その直接の基本クラスを拡張します。派生クラスは、継承するメンバーに新しいメンバーを追加できますが、継承されたメンバーの定義を削除することはできません。•インスタンスコンストラクタ、デストラクタ、および静的コンストラクタは継承されませんが、宣言されたアクセス可能性に関係なく、他のすべてのメンバーは継承されます(§3.5)。ただし、宣言されたアクセス可能性によっては、継承されたメンバーが派生クラスでアクセスできない場合があります。•派生クラスは、同じ名前または署名を持つ新しいメンバーを宣言することにより、継承されたメンバーを非表示にすることができます(§3.7.1.2)。ただし、継承されたメンバーを非表示にしても、そのメンバーは削除されないことに注意してください。派生クラスから直接そのメンバーにアクセスできなくなるだけです。•クラスのインスタンスには、クラスとその基本クラスで宣言されたすべてのインスタンスフィールドのセットが含まれ、派生クラスタイプからその基本クラスタイプのいずれかに暗黙の変換(§6.1.6)が存在します。したがって、ある派生クラスのインスタンスへの参照は、その基本クラスのいずれかのインスタンスへの参照として扱うことができます。•クラスは仮想メソッド、プロパティ、およびインデクサーを宣言でき、派生クラスはこれらの関数メンバーの実装をオーバーライドできます。これにより、クラスは、関数メンバーの呼び出しによって実行されるアクションが、その関数メンバーが呼び出されるインスタンスの実行時タイプに応じて変化するポリモーフィックな動作を示すことができます。

また、これは、C#5.0の新しい非表示機能です。

ネストされたタイプは、ベースメンバーを非表示にすることができます(§3.7.1)。新しい修飾子は、非表示を明示的に表現できるように、ネストされた型宣言で許可されます。例

using System;

class Base
{
    public static void M() {
        Console.WriteLine("Base.M");
    }
}
class Derived: Base 
{
    new public class M 
    {
        public static void F() {
            Console.WriteLine("Derived.M.F");
        }
    }
}
class Test 
{
    static void Main() {
        Derived.M.F();
    }
}

は、Baseで定義されたメソッドMを非表示にするネストされたクラスMを示しています。

于 2013-01-24T16:10:24.450 に答える
1

場合によります。

  • クラス A のメソッドがプライベートの場合: いいえ
  • クラス A のメソッドが保護されている場合: はい
  • クラス A のメソッドが public の場合: はい
  • クラス A のメソッドが public または protected で virtual の場合、クラス C はそのメソッドをオーバーライドできます。
于 2013-01-24T16:10:51.730 に答える
0

はい、クラスから継承すると、他のクラスから継承したすべてのメソッドを含む、そのすべてのメソッドを取得します。

于 2013-01-24T16:10:38.620 に答える
0
public class A
{
    public int Id { get; set; }
    protected int protectedId { get; set; }
    private int privateId;
}

public class B : A
{
}

public class C : B
{
    public C()
    {
        int temp = Id; // works
        int temp1 = protectedId; // works
        int temp2 = privateId; // does NOT work
    }
}

and in some other class;

public void SomeMethod()
{
    C c = new C();
    int i = c.Id; // works
    int j = c.protectedId; // does NOT work
    int k = c.privateId; // does NOT work
}
于 2013-01-24T16:15:36.740 に答える