HIRASE CONNECTION WK

programming collection

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

Link Collection

[C++/C#] インタフェースっていったい・・・?

C++0xのコンセプトの話

アキラさんのC++0xの資料を拝見して、コンセプトって、なんでインタフェースっていう名前にならなかったのか疑問に思ったのは自分だけ?

だって、インタフェースと機能は同じで、しばりが少ないってだけな印象なのに。。同じダックタイピングなのに。

いうなれば、コンセプトがインタフェースらしく振舞うのであれば、それは最早インタフェースだと思う。

C#のインタフェースの話

なんで継承/実装していないとキャストできないのか不思議。明示的に継承していない場合でも、関係なしにダウンキャストできていいと思うのですが。。

こんな感じ↓

using System;
interface IMyMeMine
{
    void Hello();
}

class SayHello
{
    public void Hello() { Console.WriteLine("Hello"); }
}

class Program
{
    static void Main(String[] args)
    {
        Hello(new SayHello());
    }

    static void Hello<T>(T t) where T:IMyMeMine
    {
        t.Hello();
    }
}

たとえばシステムのクラスをジェネリックに扱いたい場合に、ときどきやりたい。

投稿日時 : 2008年7月14日 22:00

コメントを追加

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 1:05 アキラ

インターフェースはたしかオブジェクト指向の用語ですよね

見た目は同じように見えても、それが継承/実装を必要とするインターフェースか、テンプレートの「xxメンバを持っていればいい」という機能の拡張・制約のためのものかで意味は全然違ってくると思います

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 1:11 アキラ

あ、ちなみに concept の本命は concept_map です
テンプレートがさらに超強力になるものです

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 1:43 アキラ

> なんで継承/実装していないとキャストできないのか不思議
C# generics が Object への Type Erasure だからでしょう。
インターフェースは Object に仮想関数テーブルを追加するイメージじゃないかと。

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 9:09 Hirotow

ダックタイピングでぐぐってみるとよいかと思います。

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 13:03 NyaRuRu

>C# generics が Object への Type Erasure だからでしょう。

これは多分誤解っす.
"Parametric Polymorphism for Popular Programming Languages" でググって出てくる PPT の 22 ページ目以降をどうぞ.

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/15 13:28 アキラ

インターフェースによって <T> の各型のコードを共有しているんですね。

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/16 0:51 T.Hirase

みなさま、ありがとうございます。
「おぉ、なんかいっぱいコメントが。。」と驚いております。。

「インタフェース」はオブジェクト指向用語というより、「ものごとの境界となる部分と、その境界でのプロトコルを指す」(from Wikipedia)という意味も含めて書いてます。

そして何となく、「インタフェース ⊆ コンセプト」って感じがして、書いてみました。
(個人的にはイコールにして欲しいという気持ちが大アリ。)


んー、というか、まだまだ勉強不足で話についていけません!
がんばりやす。

# re: [C++/C#] インタフェースっていったい・・・? 2008/07/16 1:37 T.Hirase

あ!
「where T:IMyMeMine 」この書き方って、
「ここで、TはIMyMeMineを継承/実装している」という意味か。

もし、ダックタイピングを明示したいなら、
「where T behaves as IMyMeMine」になるのか。長い。
「where T as IMyMeMine」くらいが妥当かな。

# afARDTDwmdAB 2014/08/05 6:39 http://crorkz.com/

oH8fm6 Major thanks for the article. Awesome.

タイトル
名前
URL
コメント