1

次のクラスがあるとしましょう

class animal
{
   public string name;
   public animal(string name)
   {
      this.name = name;
   }
}

そしてまた

class dog : animal
{
   public string breed;
   public dog(string name, string breed): base(name)
   {
       this.breed = breed;
   }
}

そして最後に

class poodle : dog
{
   public poodle(string name, string breed, int hairLength): base(name, breed)
   {
        //in here, name is = null for some reason.
   }
}

問題は、継承の3レベルの階層がある場合、基本コンストラクター( )がコンストラクター(name == null)animalの後に呼び出されるように見えることです。poodleしかし、poodleコンストラクターでは、基本コンストラクターなどで設定されたいくつかのプロパティにアクセスしたいと思うかもしれません。

誰かがこれをどのように行うことができるか、あるいはおそらくこの問題を解決するためのはるかに優れたコーディング方法を知っていますか?(私が考えることができる唯一の解決策は、実際にはコンストラクターを使用するのではなく、別個のinitialize()メソッドを使用することです。

ありがとう!

4

1 に答える 1

2

これは、可視性の単純な問題です。明示的に指定しないため、nameフィールドはプライベートであり、サブクラスからアクセスすることはできません。あなたはそれをそのようにすることができます:protected

protected string name;

これが最も簡単な解決策ですが、より良いアプローチはプロパティを使用することです。

protected string Name { get; set; }

そして、フィールドの代わりにこれを使用してください。

(一般に、フィールドが宣言されたタイプからエスケープされないようにすることがベストプラクティスと見なされます。したがって、宣言するタイプの外部からフィールドにアクセスする必要がある場合は、プロパティの使用を検討する必要があります。)

于 2012-05-30T01:23:40.230 に答える