今日のコードレビュー中に、私の同僚は何か面白いことを言った:
prototype
は、継承が必要な場合にのみ役立ちます-および継承が望ましい場合?
私はこれについて考えましたが、私は通常、継承を使用して、最初はうまく設計されていないコードを回避していることに気付きました。モダンOOスタイルは継承よりもコンポジションを優先しますが、これを真に受け継いで実際にenforceにした言語は知りません。
クラスベースの継承を許可しない、クラス、オブジェクト、メソッド、インターフェースなどを備えた汎用プログラミング言語はありますか? (もしそのような考えが意味をなさないのなら、なぜでしょうか?)
オブジェクト指向プログラミングの定義 の問題は別として、「構成のみを使用し、継承のためのツールを持たない言語はありますか?」
これに対する答えは非常に単純に「はい」です。伝統的に、継承を行う方法はありません。 1つcanオブジェクトを別のオブジェクトに埋め込み、そのオブジェクトを拡張します。 From Object Desoriented Language ( github 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:なぜ型の継承がないのですか? にあります。
クラスベースの継承を許可しない、クラス、オブジェクト、メソッド、インターフェースなどを備えた汎用プログラミング言語はありますか?
これは、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>
プライベート/保護を使用することにより、また「PImpl」または「プライベート実装」技術を現代的に使用することにより、コンパイラーに選択的継承を強制させることができます。
多くのAPIは、ユーザーに継承させたいコンポーネントのみを公開し、残りを別の実装クラスに隠します。そのため、パブリックインターフェイスが実際には継承不可能であり、オブジェクト構成を通じてのみ使用可能であり、コンパイラーによって実行されるクラスを作成できます。これは、コンパイラーを使用してソフトウェアの目的を実行する場合に、しばしば良い習慣です。
JavaScriptでプライベートメンバー関数を簡単に検索すると、同様の原則があることが示されますが、コードを使用できる場合はだれでもコードを見ることができます。 http://www.crockford.com/javascript/private.html