8

したがって、Java で次のコードを記述した場合:

public class A extends A{
    public static void main(String[] args){
    }
}

これにより、A が関与する循環継承というコンパイラ エラー メッセージが表示されます。

2 つのクラス A と B を作成し、A が B を継承し、B が A を継承する場合も同様です。

とにかくこれがどのように可能になるかを想像するのは非常に難しいので、これは私には理にかなっています.

次に、大学の教授の一人にこれについて尋ねました。彼は、これが可能な言語があると言い、Java ではこれが不可能であることを嘆き、循環継承などを使用したプロジェクトをいくつかやったことがあると言いましたが、私にはまったく理解できませんでした。彼はまた、循環継承を使いたいと思っていたところに問題があったと述べました。

周期的継承のこの奇妙な現象の可能な用途について教えていただけますか? それはいつ、どのように可能ですか?これが役立つ可能性がある問題はありますか?

4

5 に答える 5

7

私はこの興味深い参考文献を掘り起こしました。基本的には、繰り返しフィールドがない限り、循環継承は有効であると述べています。フィールドのルックアップは、意味を見つけるために循環の 1 つのループをトラバースするだけでよいからです。フィールドが繰り返される場合、2 つの定義のいずれも他方よりも有効ではなく、明らかに問題が発生します。

したがって、ある人を人間として定義し、有権者として定義し、それぞれに異なる属性を設定するとします。擬似コード:

class Person extends Human:
  String name;

class Human extends Voter:
  String language;

class Voter extends Person:
  Country residence;

これで、階層を定義することなく、個人のさまざまな側面に対処できるようになり、さまざまな人々を個人 (名前付き)、人間 (言語を話す)、または投票者 (特定の国) としてインスタンス化できます。他の側面よりも重要な側面はありません。

興味深いですが、研究プロジェクト以外で使用するのは実用的ではないと思います。super() コンストラクターにパラメーターを渡すすべてのクラスのコンストラクターがあると想像してください。構成全体を台無しにするのは簡単です。

更新: 指定された擬似コードは、Java 8 に変換するとコンパイルされず、明らかにどの言語でもコンパイルされません (上記のリンクで示されている Cecil を除く)。誰も有効な使用法を見つけられなかったようで、したがって循環継承は許可されませんでした。これは、その概念が本質的に不可能だという意味ではありません。ただ、実際の使用は、特別なケースを実装する努力を正当化するものではありません。

于 2012-11-20T00:07:13.657 に答える
1

循環継承の感覚がわかりません。あなたの教授が、 IS-A関係と呼ばれる継承関係が、BがAのサブクラスである場合、どこでもAが必要であるという意味で、B IS-A Aであると述べていることが、どのような場合でも役立つと考える理由はわかりません。a Bは問題なく使用できます(リスコフの置換原則)。

ここで、理論的には、AがBのサブクラスであり、BがAのサブクラスである場合、両方のクラスがまったく同じ外部インターフェイスを持っている必要があります。これは、それらのいずれかにメソッドを追加すると、他のメソッドが同じメソッドを自動的に継承するため、他の実装を取得するには、どちらかをオーバーライドする必要があるためです。

さらに、奇妙な副作用が発生する多くの状況が発生します(メソッドのA.foo()呼び出しsuper.foo()B.foo()呼び出しについて考えてsuper.foo()ください。これは許可されるべきであるため、実際的な理由はわかりません。

継承は、すべてのサブクラスがツリー内の動作またはクラスを指定するツリーとして意図されています。同じレベルに2つのクラスがあるからといって、何も役に立たないということではありません。

于 2012-11-19T23:19:26.897 に答える
1

彼らのコードはエラーをスローしないと述べている受け入れられた回答には同意しません。Java 8 を実行しており、次のコードをコンパイルしています。

class Person extends Human:
  String name;
class Human extends Voter:
  String language;
class Voter extends Person:
  String residence;

「エラー: Person を含む循環継承」というエラーが表示されました。

したがって、Java では循環継承を行うことはできません。

于 2016-05-04T19:54:59.183 に答える
1

クラスが同じレベルの階層にある場合にのみ可能であることがわかりました。クラス階層をツリーと考えてください。Java は、階層が少なくとも 1 レベル以上上にあることを確認します。一部の言語では、使用しているクラスと同じレベルのクラスから特性を継承できます。

于 2012-11-19T23:14:18.150 に答える