継承のないオブジェクト指向言語はありますか?


22

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

prototypeは、継承が必要な場合にのみ役立ちます- いつ継承が良いアイデアですか?

私はこれについて考え、私は通常、継承を使用して、最初はひどく設計されたコードを回避することに気付きました。現代のオブジェクト指向スタイルは継承よりも合成を好みますが、これを心に留めて実際に強制した言語は知りません。

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


7
あなたの同僚はあなたを惑わしました。またprototype、インスタンス間で共有するパブリックメソッドとプロパティがある場合にも役立ちます。またinstanceof、JavaScript:で演算子を適切に使用できるため便利ですif (foo instanceof Foo) { ...
グレッグブルクハート14年

2
タイプ、状態、動作の継承を区別する必要があると思います。組成物の嗜好は、Javaコミュニティで非常に一般的であるが、同時に、型の継承(さらに多重継承)が広く使用され、奨励...と使用して実現されimplementsたキーワードと状態の継承とは対照的にインターフェースを(及びextends実装を含むクラスでキーワードを使用して導入された動作)。
トニエズウィエズ14年

6
構成を優先することは、継承を完全に放棄することをお勧めするわけではありません。
カレブ14年

5
実装の継承なしのJavaを参照してください:「Googleのgoは、OOPである間に実装の継承をなくす言語の例です...」
gnat

1
@GregBurghardt同じことが、関数を含むオブジェクトを返すファクトリ関数を使用して実行できます(クロージャにプライベートデータを格納します)。newthisおよびprototypeIMOの一般的な使用には地雷原です。
ベンジャミンホジソン14年

回答:


18

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

これに対する答えは非常に単純に「はい」です。移動中は、従来のように継承を行う方法はありません。一方ができ、別のオブジェクト内のオブジェクトを埋め込み、そのオブジェクトを拡張します。オブジェクトDesoriented言語githubのミラー):

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()
}

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

詳細については、GoLangチュートリアル:Goの継承とサブクラス-またはその類似点を参照してください

そのため、はい、継承なしでオブジェクト指向言語を使用することは可能です。

goでは、これは埋め込みと呼ばれ、囲んでいる構造に埋め込みフィールドと関数にアクセスできるようにします。ただし、サブクラスではありません。設計哲学は、Go FAQ:型継承がないのはなぜですか?


typedefまたstruct、Cでの使用についてコメントすることもできます。
cwallenpoole 14年

@cwallenpooleには確かに同様のアイデアがありますが、Cをオブジェクト指向言語と呼ぶのをためらうでしょう。

私は知らないよ。関数がアタッチされたオブジェクトを作成できないという事実はそれに対して機能しますが、継承がなければ、OOPはその風味の多くを失います。
cwallenpoole 14年

@cwallenpooleそして、継承とオブジェクト指向の定義を始めます。しかし、それ可能です。問題についてのまったく異なる考え方です。問題は、継承がほとんどのC ++およびJavaプログラマーが拡張機能を考える方法であるということです...しかし、他のモデルもあります。継承なしの拡張:123は良い読み取ります。

「オブジェクト指向言語」へのリンクは現在リダイレクトループに残っていますが、次の記事を見つけました:github.com/nu7hatch/areyoufuckingcoding.me/blob/master/content/…。ありがとう!
マットブラウン

7

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

これは、Microsoft Officeや他のVBA対応ホスト(AutoCAD、Sage 300 ERPなど)、またはVB6に埋め込まれたVBA-Visual Basic for Applicationsの説明とよく似ています。とにかく「基本」の「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存在する可能性があります。複数のインターフェースも実装します。

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

場合Goは、クラスの継承を行い、それにもかかわらず、OOP言語ではありません VB6 / VBAはだけでなく、OOP言語と考えることができなかった理由を、私は表示されません。</PreemptiveResponseToVBAHatersThatWillSayItIsNotAnOOPLanguage>


1
公平を期すために、OPは現代言語について質問しました。=;)-–
ラバーダック

@RubberDuck #burn!
マチューギンドン

0

private / protectedの使用、および「PImpl」または「Private Implementation」技術の最新の使用により、コンパイラに選択的継承を強制できます。

多くのAPIは、ユーザーが継承することを望むコンポーネントのみを公開し、別の実装クラスで残りを非表示にします。そのため、実際には、パブリックインターフェイスが継承不可能であり、オブジェクト合成を介してのみ使用可能であり、コンパイラによって強制されるクラスを作成できます。コンパイラを使用してソフトウェアの意図を実行する場合、これは多くの場合、良い習慣です。

javascriptのプライベートメンバー関数をすばやく検索すると、同様の原則があることがわかりますが、使用できる場合は誰でもコードを見ることができます:http : //www.crockford.com/javascript/private.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.