問題タブ [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.

0 投票する
2 に答える
2229 参照

r - R6 クラスの多重継承

実際の質問

R6が多重継承をサポートしていないという事実を回避するためのオプションは何ですか?

免責事項

R は基本的に関数型言語であることは知っています。ただし、非常に強力なオブジェクト指向も組み込まれてます。さらに、OOD の原則/動作を模倣することの何が問題なのかわかりません。

  1. C#、Java などのオブジェクト指向言語のプロトタイピングを行っていることを知っています。

  2. アプリのプロトタイプは、自己完結型である必要があります(DB バックエンド、ビジネス ロジック、フロントエンド/UI を含む「フル スタック」)。

  3. あなたはR6のような素晴らしい「プロトタイピング技術」を持っていて、自由に使うことができます

環境

Web アプリ用の私の R プロトタイプは、「フル スタック」/自己完結型あり本番環境言語( C#/.ネット)。

その点で、コード モジュールを切り離し、OOD の SOLID 原則のD (依存性反転の原則)に準拠するために、インターフェイス (または抽象クラス) の使用が非常に好きになりました( 「ボブおじさん」による詳細な説明)。 )。

R6 はインターフェイスを明示的にサポートしていませんが、「抽象メソッド」のみを定義する R6 クラスで完全に模倣できます(以下の例を参照)。これは、R にあまり詳しくない OO プログラマーに私のソフトウェア設計を伝えるのに非常に役立ちます。

ただし、実際に他の具象から継承したい場合(「 abstractのような」模倣されたインターフェイス クラスとは対照的に) には、少し問題になるinheritinの値を放棄する必要があります。しかし、 の 2 つのクラス。R6Classinherit

依存関係の反転前:

Foo具体的なクラスに依存しBarます。OOD 原則の観点からは、コードが密結合になるため、これはかなり悪いことです。

依存関係の反転後:

FooBar現在は切り離されています。どちらも、 class によって模倣されるインターフェースに依存していますIBar。実行時に のインスタンスにプラグインするインターフェイスの実装を決定できFooます (プロパティ インジェクション: のフィールドbarによって実現Foo)

これがOODに関して理にかなっている理由について少し詳しく説明します。フィールドに格納されたオブジェクトが実装Fooされる方法に完全に依存しない必要があります。知る必要があるのは、そのオブジェクトで呼び出すことができるメソッドだけです。それを知るには、 field 内のオブジェクトが実装するインターフェース(私たちの場合は method ) を知るだけで十分です。barbarIBardoSomething()

基本クラスからの継承を使用して設計を簡素化する:

ここまでは順調ですね。ただし、他の具象クラスの一部が継承できる特定の具象基本クラスを定義することで、設計を簡素化したいと考えています。

「インターフェースの実装」と基本クラスの継承を組み合わせる:

これは、多重継承が必要な場所なので、次のようなものが機能します (PSEUDO CODE):

現在、私の値inheritは、インターフェイスの実装を模倣するために「ちょうど」使い果たされているため、実際の具象クラスの継承の「実際の」利点を失います。

別の考え:

あるいは、インターフェイス具象クラスの区別を何らかの形で明示的にサポートすることは素晴らしいことです。たとえば、このようなもの

0 投票する
1 に答える
509 参照

r - クロージャを使用して R6 バインディングを生成する

フィールドに割り当てる前に値をチェックするために、R6 クラスでアクティブ バインディングを使用しています。以下のようにクロージャーを使用してバインディングを生成できると考えましたが、これは機能しません。

nameエラーがクロージャーの引数を示しているため、バインディングは期待どおりに評価されません (まったく?) 。私は何が欠けていますか?

0 投票する
1 に答える
2493 参照

r - R6 クラスのサブクラスの初期化メソッドを変更する

R6 クラスがあるとしましょうPerson:

メソッドが同じであるサブクラスを作成したい場合、initialize変数をもう 1 つ追加する以外はselfどうすればよいでしょうか?
私は次のことを試しました:

ただし、クラスの新しいインスタンスを作成するとPersonWithSurname、フィールドnameとフィールドhairNA、つまりクラスのデフォルト値になりますPerson

ではPython、次のことを行います。

0 投票する
1 に答える
145 参照

r - R、R6、パブリック メソッドのフォーマル

R6 クラス定義のメソッド定義の形式を取得するにはどうすればよいですか?

たとえば、上記では、fun実行できるのと同じ方法で、定義の形式を取得したいと思います。たとえば、formals(lm)

0 投票する
1 に答える
936 参照

r - R、R6、R6Generator オブジェクトから完全なクラス名を取得

R6 では、ジェネレータ オブジェクトのインスタンスを作成せずに、クラス継承の完全なリストを取得するにはどうすればよいですか?

次の点を考慮してください。

私が欲しいのはc('Top','Base','R6')

言い換えれば、そうでなければ何が返されるかclass(B$new())

現実の世界では、複雑な一連の継承があり、多くの引数を持つ初期化子があり、一部にはデフォルト値がないため、この情報を取得するために新しいオブジェクトをインスタンス化することを避けようとしています。

0 投票する
1 に答える
142 参照

r - 関数で戻り値の型を強制する

R6 を使用して、メソッドが特定のデータ型を返すことを強制したいのですが、これは可能ですか?

たとえば、次のことを考慮してください。

関数getx()が整数を返すようにする場合は、A のインスタンスで問題ありませんが、B の場合のように、サブクラスが異なる型を返さないようにしたいのです。つまり、関数に一貫性を持たせたいのです。実際に実装されている場所に関係なく、返されるもので。