DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インタフェースクラスにコンストラクタは無理??

環境/言語:[VB.NET]
分類:[.NET]

お世話になります。

コンストラクタを持つクラスにインタフェースを持たせたいのですが、
可能ですか?

低レベルな質問ですみません。

上記の場合、インターフェースの定義がどのようになるのか
ご教授お願いします。
■No17444に返信(らららさんの記事)
> お世話になります。
>
> コンストラクタを持つクラスにインタフェースを持たせたいのですが、
> 可能ですか?
>
> 低レベルな質問ですみません。
>
> 上記の場合、インターフェースの定義がどのようになるのか
> ご教授お願いします。
abstructなクラスにしてみては(VB.NETでできるか試していませんが)
コンストラクタを持つクラスにインタフェースを持たせるというのは、

Interface IHoge
 Function FHoge() As HogeType
End Interface

Class HogeClass
 Implements IHoge
 Public Sub New(引数有または無)
  ...
 End Sub
 Public Function FHoge() As HogeType Implements IHoge.FHoge
  ...
 End Function
 ...
End Class

という感じのものでしょうか。それならば、普通に可能ですが、はずしてたらすみません^^;
お世話になります。

■No17444に返信(らららさんの記事)
千八巧者さんのおっしゃるとおり普通に可能なはずですが
何かにつまづいていらっしゃるのでしょうか?
('A`)シマッタ…
"コンストラクタをインタフェイスに"と読んでました(orz
というわけで前言はただの戯言です。スミマセン;;
タイトルの「インタフェースクラス」(C++でインタフェースとして機能させるクラスを指す語ですね)が気になったので、もうちょっと考えてみましたが、もしかしたら、次のような意味でしょうか。

あるインタフェースを実装するクラスには、HogeType型の変数1個を引数としてもつコンストラクタを持たせたいと考え

Interface IHoge
 Public Sub New(ByVal h As HogeType)
 ...
End Interface

というコードを書いたら「'Sub New'をインターフェイスで宣言することはできません。」というエラーが出るのを回避する方法はないか、と。

それは不可能ですが、IHogeを実装するクラスが持つべき機能にHogeType型の変数が関係するなら、そのことをプロパティやメソッドとしてIHogeに記述してやればいいと思います。
■No17453に返信(千八巧者さんの記事)
> あるインタフェースを実装するクラスには、HogeType型の変数1個を引数としてもつコンストラクタを持たせたいと考え
>
> Interface IHoge
>  Public Sub New(ByVal h As HogeType)
>  ...
> End Interface
>
> というコードを書いたら「'Sub New'をインターフェイスで宣言することはできません。」というエラーが出るのを回避する方法はないか、と。
>
> それは不可能ですが、IHogeを実装するクラスが持つべき機能にHogeType型の変数が関係するなら、そのことをプロパティやメソッドとしてIHogeに記述してやればいいと思います。

その通りです。
インスタンスを実装するクラスをインターフェースを使って依存しない様にするにはどうすればよいのでしょうか?
お知恵をお貸しください。
> インスタンスを実装するクラスをインターフェースを使って依存しない様にするにはどうすればよいのでしょうか?

この意味がわからないのですが、

インタフェースにコンストラクタを記述できないという仕様は、そうするのが合理的だからそうなっているわけで、自然にコーディングしていれば困ることはないと思います。

素人なので正しく理解しているか自信ありませんが、インタフェースは実装クラスの統一したふるまいを記述するのが目的であり、インスタンスの生成法については各実装クラスの必要に応じて決めてやればいいと思います。つまり、統一したコンストラクタは不要なはず、ということになります。
もしかしたらデザパタに有るかも?:
http://www.google.co.jp/search?complete=1&hl=ja&q=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3&lr=
■No17465に返信(ガッさんの記事)
……うーむ。
…継承使えばいいというわけでもないのかな?
2006/09/07(Thu) 17:53:42 編集(投稿者)

■No17474に返信(るしぇさんの記事)
> ■No17465に返信(ガッさんの記事)
> ……うーむ。
> …継承使えばいいというわけでもないのかな?
最初の発言で軽くabstractなクラスを無視されたので
微妙に継承ではないのかもしれません;
でももしかしたら継承かも…しかしinterfaceと明示してあるから実装?
…ううーん。

※abstruct→abstract に訂正(ptz
2006/09/07(Thu) 20:06:51 編集(投稿者)

インタフェースをやめて抽象クラスを使うのならば

MustInherit Class A
    Protected Sub New(ByVal i As Integer, ByVal d As Double)
        ...
    End Sub
    MustOverride Function F(ByVal j As Integer) As Integer
    ...
End Class

Class B
    Inherits A
    Public Sub New(ByVal i As Integer, ByVal d As Double)
        MyBase.New(i, d)
        ...
    End Sub
    Public Overrides Function F(ByVal j As Integer) As Integer
        ...
    End Function
    ...
End Class

のように、抽象クラスに引数のあるコンストラクタだけを書いておけば、
継承クラスでは必ずMyBase.Newを呼ばないとエラーにしてくれますが。
でもこの方式だとほかのクラスを継承できなくなるので、使える場合は限られてきますよね。

----------
追記です。

私もこの方式をとったことがありますが、それは、必要に応じて自然とその形になったからで、
コンストラクタのシグネチャを統一するのが目的ではありませんでした。
もしほかに必要がなければ、無理にこうすることはないかと。

あと、「ほかのクラスを継承できなくなる」というのがちょっと紛らわしかったかもしれませんが、
「それぞれの継承クラスがさらに別々のクラスを継承することは言語仕様上できない」という意味でした。
もし、継承させるクラスがひとつであれば、抽象クラスがそれを継承すればよいわけですね。

DOBON.NET | プログラミング道 | プログラミング掲示板