2017-01-06 5 views
1

私は継承を理解し、理解するためにいくつかの問題があると考えています。第2レベルのスーパークラスにパラメータを渡すにはどうすればいいですか

public class SiteTemplate extends SiteTemplateMethods 

    public SiteTemplate(String country, String language, HttpServletRequest request){ 
     super(); 


    } 

public class SiteTemplateMethods extends Resources 

public class Resources extends PropertyFiles 

1)クラスPropertyFilesすべてのメソッドは、クラスResourcesSiteTemplateMethodsSiteTemplateからアクセスできるようになります。そうですか? SiteTemplateコンストラクタで

2)​​はSiteTemplateMethodsにすべてのパラメータを渡しますが、これらのパラメータは、私は2番目のレベルのスーパークラスResourceクラスにSiteTemplateクラスのパラメータを取得することができますどのようにクラスSiteTemplateMethodsここで必要とされていませんか?

敬具

+0

1.はい(プライベートメソッドを除く)。 2.あなたは 'SiteTemplateMethods'のコンストラクタを通してそれらを渡す必要があります。サブクラスで実装する抽象プロバイダメソッドを持つ 'Resources'のような他のオプションがありますが、それは' SiteTemplateMethods'抽象化を必要とするか、またはそれらのメソッドを実装する必要があります。 –

+0

これは、まず、 'Resource'クラスと同じコンストラクタをパラメータで作成してから、super()キーワードを使用する必要があることを意味します。そうですか? – Ghayel

+0

はい、 'super();'の代わりに 'super(country、language、request);'を呼び出すだけです。ところで、 'super();はそれ自身では冗長です。自動的に起こります。 –

答えて

0

1)クラスPropertyFilesすべてのメソッドは、クラスResourcesSiteTemplateMethodsSiteTemplateからアクセスできるようになります。そうですか?

いいえ、正しくありません。 PropertyFilesのすべてpublicprotectedメンバーはResourcesSiteTemplateMethods、およびSiteTemplate含む子孫クラスにアクセスできるようになりますが、PropertyFilesprivate方法は、サブクラスにアクセスすることはできません。パッケージプライベートメソッドは、子パッケージがResourcesと同じパッケージに含まれている場合にのみアクセス可能です。 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.htmlを参照してください。

オーバーライドされたメソッドへのアクセスには、(@Gergelyが最初に注意したように)追加の制限があります。 SiteTemplateコンストラクタで

2)​​いいえ、それはないでしょうSiteTemplateMethods

にすべてのパラメータを渡します。引数なしのsuper()は、引数を渡さずに直接スーパークラスの引数なしコンストラクタを呼び出します。直接のスーパークラスにアクセスできない引数なし​​のコンストラクタがない場合、その呼び出しは無効です。

異なるコンストラクタ、つまり引数を受け入れるコンストラクタを呼び出すには、対応する引数リストを使用してsuper()を呼び出す必要があります。

が、これらのパラメータは、私が第2レベルのスーパークラスResourceクラスにSiteTemplateクラスのパラメータを取得することができますどのようにクラスSiteTemplateMethodsここで必要とされていませんか?

SiteTemplateMethodsは、あなたがSiteTemplateのコンストラクタの先頭に(引数付き)対応super()呼び出しを使用することができ、Resourceの(それまで)にアクセスコンストラクタに引数を渡すにアクセスコンストラクタを持っている場合。それ以外の場合は、SiteTemplateのコンストラクタは、プロパティ設定メソッドを呼び出すなどして、クラスResourceに適した方法でパラメータを直接適用する必要があります。

+0

私の基本的な質問は最後の部分です。スーパークラスのパブリックメソッドにすべての子クラスがアクセスできる場合、子クラスパラメータは、すべてのスーパークラスの第2または第3またはnレベルクラスのsuperキーワードでアクセス可能でなければなりません。それは可能ですか? – Ghayel

+0

私はあなたがそのようなことが可能でなければならないと思うものは何も考えていません。一般的に言えば、クラスはそのサブクラスについては何も知りません。さらに、コンストラクタまたはメソッドは、それを呼び出すコンストラクタまたはメソッドのパラメータまたはローカル変数にアクセスできません。 'super()'を介しても、コンストラクタにパラメータを(明示的に)渡すことができますが、それは直接呼び出されるコンストラクタだけに影響し、呼び出すコンストラクタやメソッドではありません。 –

0

いくつかの方法を宣言しましょう。SiteTemplate

public class Resources extends PropertyFiles{ 
    public Resources(String country,String language){ 
      super(); 
      //... 
    } 
    public void a(){ 
      //... 
    } 
    public void b(){ 
      //... 
    } 
    public void c(){ 
      //... 
    } 
} 
public class SiteTemplateMethods extends Resources{ 
    public SiteTemplateMethods(){ 
      super("foo","bar"); 
      //... 
    } 
    public void a(){ 
      //... 
    } 
    public void b(){ 
      super.b();//This will call the superclass's method 
      //... 
    } 
} 

1)彼らはSiteTemplateMethodsによって上書きされたので、あなたは、Resourcesなくa()b()からc()にアクセスすることができます。 a()を呼び出すと、代わりにSiteTemplateMethodsa()メソッドが呼び出されます。 SiteTemplateのインスタンスがある場合はa()メソッドをResourcesと呼び出すことはできません。ただしb()メソッドはSiteTemplateMethodsにあり、スーパークラスメソッドを呼び出し、その後に追加コードを実行します。

2)コンストラクタ呼び出しでは、クラスによって直接宣言されたコンストラクタにしかアクセスできません。 SiteTemplateMethodsは、次のことを宣言しない限り、与えられた例ではあなたは、SiteTemplatesuper(String country,String language)を呼び出すことはできません。

public SiteTemplateMethods(String country,String language){ 
    super(country,language); 
    //... 
} 

はまた、異なるパラメータを持つメソッドは、2つの異なるメソッドとして扱われることに注意してください。したがってa(String str)a()を上書きしません。ただし、オーバーライドするメソッドが以前のメソッドの引数に完全に適用できる場合は、これは当てはまりません。したがってa(Object o)は、a(String str)を上書きします。

関連する問題