トップ回答者
F#でインナークラスの定義の仕方

質問
-
C#で以下のクラスがあったとします。
class Class1{} class Class2:Class1{ class InnerClass{} }
これをF#で実現しようとすると
type Class1()=class end type Class2()= inherit Class1() with type InnerClass()=class end
こうであると思いますが4行目のtypeに赤の波線が付き
予期しない キーワード 'type' です 型定義内。このポイントまたはその前にある構造化コンストラクトが不完全です、'end'、または他のトークンを指定してください。
とでます。どのように記述すればよいでしょうか。
回答
-
私なりの理解で事情を説明すると
現状ではlet変数はスコープ内から参照できる、とされています。具体的にはコンストラクター中のlet変数はメソッドから参照することでフィールドのように扱えますし、モジュールやクラスでは親モジュールのlet変数を参照できます。
この構造のまま、インナークラスに適用してしまうと内部クラスのインスタンスは親クラスのlet変数を参照できるべき、となってしまいます。しかし親クラスは複数のインスタンスを生成できるはずであり内部クラスからはどのインスタンスのlet変数を参照すべきなのかを表現できません。この辺りの事情があってインナークラスは実現しようがない、と解釈しています。
私の場合ですとWebBrowser.WebBrowserSiteクラスを継承する必要がありましたがF#言語では実現できなく困ったこともあります。
これと類似してHttpClientHandlerクラスを継承することもできません。F#言語では非同期に親クラスメンバーを呼び出すことができないため、肝心のSendAsync()メソッドを実装できません。
-
こんにちは。
こちらを見る限りではインナークラスは定義できなさそうです。
また、以下にユーザー要望が挙がってました。---
InnnerClassをClass2で参照したいのであれば、
最初のリンクの「Mutually Recursive Types」で表現できないものでしょうか。
すべての返信
-
こんにちは。
こちらを見る限りではインナークラスは定義できなさそうです。
また、以下にユーザー要望が挙がってました。---
InnnerClassをClass2で参照したいのであれば、
最初のリンクの「Mutually Recursive Types」で表現できないものでしょうか。 -
私なりの理解で事情を説明すると
現状ではlet変数はスコープ内から参照できる、とされています。具体的にはコンストラクター中のlet変数はメソッドから参照することでフィールドのように扱えますし、モジュールやクラスでは親モジュールのlet変数を参照できます。
この構造のまま、インナークラスに適用してしまうと内部クラスのインスタンスは親クラスのlet変数を参照できるべき、となってしまいます。しかし親クラスは複数のインスタンスを生成できるはずであり内部クラスからはどのインスタンスのlet変数を参照すべきなのかを表現できません。この辺りの事情があってインナークラスは実現しようがない、と解釈しています。
私の場合ですとWebBrowser.WebBrowserSiteクラスを継承する必要がありましたがF#言語では実現できなく困ったこともあります。
これと類似してHttpClientHandlerクラスを継承することもできません。F#言語では非同期に親クラスメンバーを呼び出すことができないため、肝心のSendAsync()メソッドを実装できません。