問題タブ [r6]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - R6 クラスの多重継承
実際の質問
R6が多重継承をサポートしていないという事実を回避するためのオプションは何ですか?
免責事項
R は基本的に関数型言語であることは知っています。ただし、非常に強力なオブジェクト指向も組み込まれています。さらに、OOD の原則/動作を模倣することの何が問題なのかわかりません。
C#、Java などのオブジェクト指向言語のプロトタイピングを行っていることを知っています。
アプリのプロトタイプは、自己完結型である必要があります(DB バックエンド、ビジネス ロジック、フロントエンド/UI を含む「フル スタック」)。
あなたはR6のような素晴らしい「プロトタイピング技術」を持っていて、自由に使うことができます
環境
Web アプリ用の私の R プロトタイプは、「フル スタック」/自己完結型であり、本番環境言語( C#/.ネット)。
その点で、コード モジュールを切り離し、OOD の SOLID 原則のD (依存性反転の原則)に準拠するために、インターフェイス (または抽象クラス) の使用が非常に好きになりました( 「ボブおじさん」による詳細な説明)。 )。
R6 はインターフェイスを明示的にサポートしていませんが、「抽象メソッド」のみを定義する R6 クラスで完全に模倣できます(以下の例を参照)。これは、R にあまり詳しくない OO プログラマーに私のソフトウェア設計を伝えるのに非常に役立ちます。
ただし、実際に他の具象から継承したい場合(「 abstractのような」模倣されたインターフェイス クラスとは対照的に) には、少し問題になるinherit
inの値を放棄する必要があります。しかし、 の 2 つのクラス。R6Class
inherit
例
依存関係の反転前:
Foo
具体的なクラスに依存しBar
ます。OOD 原則の観点からは、コードが密結合になるため、これはかなり悪いことです。
依存関係の反転後:
Foo
Bar
現在は切り離されています。どちらも、 class によって模倣されるインターフェースに依存していますIBar
。実行時に のインスタンスにプラグインするインターフェイスの実装を決定できFoo
ます (プロパティ インジェクション: のフィールドbar
によって実現Foo
)
これがOODに関して理にかなっている理由について少し詳しく説明します。フィールドに格納されたオブジェクトが実装Foo
される方法に完全に依存しない必要があります。知る必要があるのは、そのオブジェクトで呼び出すことができるメソッドだけです。それを知るには、 field 内のオブジェクトが実装するインターフェース(私たちの場合は method ) を知るだけで十分です。bar
bar
IBar
doSomething()
基本クラスからの継承を使用して設計を簡素化する:
ここまでは順調ですね。ただし、他の具象クラスの一部が継承できる特定の具象基本クラスを定義することで、設計を簡素化したいとも考えています。
「インターフェースの実装」と基本クラスの継承を組み合わせる:
これは、多重継承が必要な場所なので、次のようなものが機能します (PSEUDO CODE):
現在、私の値inherit
は、インターフェイスの実装を模倣するために「ちょうど」使い果たされているため、実際の具象クラスの継承の「実際の」利点を失います。
別の考え:
あるいは、インターフェイス と具象クラスの区別を何らかの形で明示的にサポートすることは素晴らしいことです。たとえば、このようなもの
r - クロージャを使用して R6 バインディングを生成する
フィールドに割り当てる前に値をチェックするために、R6 クラスでアクティブ バインディングを使用しています。以下のようにクロージャーを使用してバインディングを生成できると考えましたが、これは機能しません。
name
エラーがクロージャーの引数を示しているため、バインディングは期待どおりに評価されません (まったく?) 。私は何が欠けていますか?
r - R6 クラスのサブクラスの初期化メソッドを変更する
R6 クラスがあるとしましょうPerson
:
メソッドが同じであるサブクラスを作成したい場合、initialize
変数をもう 1 つ追加する以外はself
どうすればよいでしょうか?
私は次のことを試しました:
ただし、クラスの新しいインスタンスを作成するとPersonWithSurname
、フィールドname
とフィールドhair
はNA
、つまりクラスのデフォルト値になりますPerson
。
ではPython
、次のことを行います。
r - R、R6、パブリック メソッドのフォーマル
R6 クラス定義のメソッド定義の形式を取得するにはどうすればよいですか?
たとえば、上記では、fun
実行できるのと同じ方法で、定義の形式を取得したいと思います。たとえば、formals(lm)
r - R、R6、R6Generator オブジェクトから完全なクラス名を取得
R6 では、ジェネレータ オブジェクトのインスタンスを作成せずに、クラス継承の完全なリストを取得するにはどうすればよいですか?
次の点を考慮してください。
私が欲しいのはc('Top','Base','R6')
言い換えれば、そうでなければ何が返されるかclass(B$new())
現実の世界では、複雑な一連の継承があり、多くの引数を持つ初期化子があり、一部にはデフォルト値がないため、この情報を取得するために新しいオブジェクトをインスタンス化することを避けようとしています。
r - 関数で戻り値の型を強制する
R6 を使用して、メソッドが特定のデータ型を返すことを強制したいのですが、これは可能ですか?
たとえば、次のことを考慮してください。
関数getx()
が整数を返すようにする場合は、A のインスタンスで問題ありませんが、B の場合のように、サブクラスが異なる型を返さないようにしたいのです。つまり、関数に一貫性を持たせたいのです。実際に実装されている場所に関係なく、返されるもので。