2

C# でのこの基本的な OOPS の概念についての理解を深めたいと思います。ほとんどのインターネット サイトで、派生クラスが基本クラスのプライベート メンバーを継承することを読みましたが、それらのメンバーにはアクセスできません。

派生クラスは、基本クラスの public、protected、internal、および protected internal メンバーにアクセスできます。派生クラスは基本クラスのプライベート メンバーを継承しますが、それらのメンバーにアクセスすることはできません。ただし、これらのプライベート メンバーはすべて派生クラスに存在し、基本クラス自体で行うのと同じ作業を行うことができます。たとえば、保護された基本クラスのメソッドがプライベート フィールドにアクセスするとします。継承された基本クラスのメソッドが正しく機能するためには、そのフィールドが派生クラスに存在する必要があります。

ソース: http://msdn.microsoft.com/en-us/library/ms173149.aspx

私の質問は、上記が正しいと考える場合、「基本クラスのコンストラクターは派生クラスで継承されますが、派生クラスは base キーワードを使用して独自のコンストラクターを介してのみアクセス/呼び出すことができ、このコンストラクターは使用できません」と言えますか?派生クラスのインスタンスを作成中に外の世界" .

public class Employee
{
    public int salary;

    public Employee(int annualSalary)
    {
        salary = annualSalary;
    }
}

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

基本クラスのコンストラクターを呼び出すには、そのクラス内に存在する必要があるためです。私の解釈が間違っているのかもしれません。誰でもこれを説明できますか?

前もって感謝します!

4

4 に答える 4

1

を構築するには、基本クラスの任意のManagerコンストラクターを使用して基本クラスを構築する必要があります。(この場合のように) コンストラクターが 1 つしかない場合は、それを呼び出す必要があります。これは、同じシグネチャでコンストラクターを定義する必要があるという意味ではありません。

これを行うこともできます:

public Manager() : base(100000)
{
}

また

public Manager(string name, int salary) : base (salary)
{
     // store name
}

あなたの構築中Managerに、ヒープに新しいオブジェクトを割り当てます。Employeeこのオブジェクトは、基本クラス ( ) と具象クラス ( ) で定義された変数を格納できるように、十分なメモリを要求しますManager

于 2013-02-25T08:00:23.923 に答える
1

「現在」をどのように定義するかによって異なります。「どこかで利用できる」と定義すると、基本クラスのプライベートメンバーはコンストラクターと同様に「存在」します。「存在」を「その特定のクラスで見つかった」と定義すると、どちらも「存在」しません。

反射を使用してみてください。基本クラスからのプライベート メンバーは見つかりません。プライベート メンバーは継承されるため、使用できますが、基本クラスでのみ使用できます。

コンストラクターも同様です。

    class A
    {
        private A(int i) { }
        public A() { }
        private void Foo() { }
        public void Bar() { }
    }

    class B : A
    {

    }

    var aProperties = typeof(A).GetMembers(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy);
    // you won't see Foo in this line, nor any constructors of A
    var bProperties = typeof(B).GetMembers(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public  | BindingFlags.FlattenHierarchy);

最後に、次のように言えます。

  • 基本クラスのすべてのメンバーは、何らかの方法で実行できるという点で存在します。
  • 継承クラスからプライベート メンバーを呼び出す構文はありません (また、クラス外のどこからでも)。
  • base基本クラスのコンストラクターは、キーワードを使用してコンストラクターからのみ呼び出すことができます。(コンストラクターは常に、階層内の各基本クラスから呼び出されます。指定されていない場合、それが既定のコンストラクターになります。)
  • クラスによって宣言 (またはオーバーライド) されたメンバーのみが、実際にはその特定のクラスの "内部" で見つかります。リフレクションを使用するBindingFlags.FlattenHierarchyと、基本クラスから可視メンバーをフラット化できます。プライベート メンバーとコンストラクターは、宣言クラスでのみ見つかります。
于 2013-02-25T08:01:15.690 に答える
0

「基本クラスのコンストラクターは派生クラスに継承されますが、派生クラスは基本キーワードを使用して独自のコンストラクターを介してのみアクセス/呼び出すことができ、派生クラスのインスタンスを作成している間、このコンストラクターを外部で使用することはできません。」

はい、これは正しいです。

基本クラスのコンストラクターを呼び出すには、そのクラス内に存在する必要があります。

基地の私的または保護されたメンバーと同じように、それは「存在」しますが、外部にアクセスすることはできません。

于 2013-02-25T08:37:47.063 に答える