web-dev-qa-db-ja.com

継承のないOO言語はありますか?

今日のコードレビュー中に、私の同僚は何か面白いことを言った:

prototypeは、継承が必要な場合にのみ役立ちます-および継承が望ましい場合

私はこれについて考えましたが、私は通常、継承を使用して、最初はうまく設計されていないコードを回避していることに気付きました。モダンOOスタイルは継承よりもコンポジションを優先しますが、これを真に受け継いで実際にenforceにした言語は知りません。

クラスベースの継承を許可しない、クラス、オブジェクト、メソッド、インターフェースなどを備えた汎用プログラミング言語はありますか? (もしそのような考えが意味をなさないのなら、なぜでしょうか?)

22

オブジェクト指向プログラミングの定義 の問題は別として、「構成のみを使用し、継承のためのツールを持たない言語はありますか?」

これに対する答えは非常に単純に「はい」です。伝統的に、継承を行う方法はありません。 1つcanオブジェクトを別のオブジェクトに埋め込み、そのオブジェクトを拡張します。 From Object Desoriented Languagegithub mirror ):

type Person struct {
        Name string
}

func (p *Person) Intro() string {
        return p.Name
}

type Woman struct {
        Person
}

func (w *Woman) Intro() string {
        return "Mrs. " + w.Person.Intro()
}

文字列であるNameを持つperson構造体があります。名前を返すIntroというパブリック関数があります。 Woman構造体には、Introに埋め込まれたStrutにアクセスするための関数もあります。そして、構成のみを使用することによって、継承の意図を果たすことができます。

これについての詳細は GoLangチュートリアル:Goでの継承とサブクラス化-またはそれに近いもの で確認できます。

だから、はい、継承なしでOO言語を持つことが可能であり、存在します。

Go内では、これは embedding として知られており、埋め込まれたフィールドと関数にアクセスする機能を囲み構造に与えます。ただし、サブクラスではありません。設計哲学は Go FAQ:なぜ型の継承がないのですか? にあります。

18
user40980

クラスベースの継承を許可しない、クラス、オブジェクト、メソッド、インターフェースなどを備えた汎用プログラミング言語はありますか?

これは、Microsoft Officeや他のVBA対応ホスト(AutoCAD、Sage 300 ERPなど)に組み込まれているVBA-Visual Basic for Applications、またはVB6の説明とよく似ています。 「ベーシック」の「A」はとにかく「汎用」を意味するので、「汎用」の部分があります。

VB6/VBAには、クラス(およびオブジェクト)、メソッド、およびインターフェースがあります。次のようなクラスモジュールでISomethingインターフェースを定義できます。

Option Explicit

Public Sub DoSomething()
End Sub

そして、これを行う別のクラスがあります:

Option Explicit
Implements ISomething

Private Sub ISomething_DoSomething()
    'implementation here
End Sub

このようなクラスは公開メンバーを公開せず、ISomethingインターフェースを介してのみアクセスできます-ISomethingのさまざまな実装が多数存在する可能性があるため、OOP VBAコードはポリモーフィズムに完全に対応しており、特定のクラスが複数のインターフェイスを実装することも完全に合法です。

VB6/VBAはクラスの継承を許可しないため、の実装を継承できません別のタイプから、そのインターフェースのみ。さて、これが事故であろうと、設計上の欠陥であろうと、天才の一撃であろうと、巨大な醜い見落としであろうと、議論の余地があります。 VB6/VBAがこれを実現するかどうかは明確ではありませんが、最も確実にenforces それ。

Goがクラスの継承を行わず、それでもOOP言語である の場合、VB6/VBAがOOP言語と見なされなかった理由がわかりません。 </PreemptiveResponseToVBAHatersThatWillSayItIsNotAnOOPLanguage>

6
Mathieu Guindon

プライベート/保護を使用することにより、また「PImpl」または「プライベート実装」技術を現代的に使用することにより、コンパイラーに選択的継承を強制させることができます。

多くのAPIは、ユーザーに継承させたいコンポーネントのみを公開し、残りを別の実装クラスに隠します。そのため、パブリックインターフェイスが実際には継承不可能であり、オブジェクト構成を通じてのみ使用可能であり、コンパイラーによって実行されるクラスを作成できます。これは、コンパイラーを使用してソフトウェアの目的を実行する場合に、しばしば良い習慣です。

JavaScriptでプライベートメンバー関数を簡単に検索すると、同様の原則があることが示されますが、コードを使用できる場合はだれでもコードを見ることができます。 http://www.crockford.com/javascript/private.html

0
Ruan Caiman