none
F#でインナークラスの定義の仕方 RRS feed

  • 質問

  • 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'、または他のトークンを指定してください。
    とでます。どのように記述すればよいでしょうか。

    2016年5月12日 17:26

回答

  • 私なりの理解で事情を説明すると

    現状ではlet変数はスコープ内から参照できる、とされています。具体的にはコンストラクター中のlet変数はメソッドから参照することでフィールドのように扱えますし、モジュールやクラスでは親モジュールのlet変数を参照できます。
    この構造のまま、インナークラスに適用してしまうと内部クラスのインスタンスは親クラスのlet変数を参照できるべき、となってしまいます。しかし親クラスは複数のインスタンスを生成できるはずであり内部クラスからはどのインスタンスのlet変数を参照すべきなのかを表現できません。

    この辺りの事情があってインナークラスは実現しようがない、と解釈しています。

    私の場合ですとWebBrowser.WebBrowserSiteクラスを継承する必要がありましたがF#言語では実現できなく困ったこともあります。

    これと類似してHttpClientHandlerクラスを継承することもできません。F#言語では非同期に親クラスメンバーを呼び出すことができないため、肝心のSendAsync()メソッドを実装できません。

    • 回答の候補に設定 佐祐理 2016年5月14日 1:19
    • 回答としてマーク 星 睦美 2016年6月7日 1:12
    2016年5月12日 21:43
  • こんにちは。

    Classes (F#)

    こちらを見る限りではインナークラスは定義できなさそうです。
    また、以下にユーザー要望が挙がってました。

    Nested types for F#

    ---

    InnnerClassをClass2で参照したいのであれば、
    最初のリンクの「Mutually Recursive Types」で表現できないものでしょうか。

    • 回答の候補に設定 佐祐理 2016年5月14日 1:19
    • 回答としてマーク 星 睦美 2016年6月7日 1:12
    2016年5月12日 18:52
    モデレータ

すべての返信

  • こんにちは。

    Classes (F#)

    こちらを見る限りではインナークラスは定義できなさそうです。
    また、以下にユーザー要望が挙がってました。

    Nested types for F#

    ---

    InnnerClassをClass2で参照したいのであれば、
    最初のリンクの「Mutually Recursive Types」で表現できないものでしょうか。

    • 回答の候補に設定 佐祐理 2016年5月14日 1:19
    • 回答としてマーク 星 睦美 2016年6月7日 1:12
    2016年5月12日 18:52
    モデレータ
  • 私なりの理解で事情を説明すると

    現状ではlet変数はスコープ内から参照できる、とされています。具体的にはコンストラクター中のlet変数はメソッドから参照することでフィールドのように扱えますし、モジュールやクラスでは親モジュールのlet変数を参照できます。
    この構造のまま、インナークラスに適用してしまうと内部クラスのインスタンスは親クラスのlet変数を参照できるべき、となってしまいます。しかし親クラスは複数のインスタンスを生成できるはずであり内部クラスからはどのインスタンスのlet変数を参照すべきなのかを表現できません。

    この辺りの事情があってインナークラスは実現しようがない、と解釈しています。

    私の場合ですとWebBrowser.WebBrowserSiteクラスを継承する必要がありましたがF#言語では実現できなく困ったこともあります。

    これと類似してHttpClientHandlerクラスを継承することもできません。F#言語では非同期に親クラスメンバーを呼び出すことができないため、肝心のSendAsync()メソッドを実装できません。

    • 回答の候補に設定 佐祐理 2016年5月14日 1:19
    • 回答としてマーク 星 睦美 2016年6月7日 1:12
    2016年5月12日 21:43