質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

989閲覧

インターフェイスとコンセプトの違いについて

Paalon

総合スコア266

Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/05/29 10:00

編集2018/05/29 10:06

インターフェイス/interfaceとコンセプト/conceptの違いについて教えてください。
Go言語ではこのサイトに従ってインターフェイスの使用例を実装してみると、

go

1package main 2 3import "fmt" 4 5type Animal interface { 6 Cry() 7} 8 9type Dog struct {} 10 11type Cat struct {} 12 13func (dog *Dog) Cry() { 14 fmt.Println("わんわん") 15} 16 17func (cat *Cat) Cry() { 18 fmt.Println("にゃーにゃー") 19} 20 21func letCry(animal Animal) { 22 fmt.Println("鳴け!") 23 animal.Cry() 24} 25 26func main() { 27 dog := new(Dog) 28 cat := new(Cat) 29 letCry(dog) 30 letCry(cat) 31}

こんな感じになり、Nimではコンセプトという機能を使ったとして、

nim

1type Animal = concept x 2 cry(x) 3 4type Dog = object 5 6type Cat = object 7 8proc cry(dog: Dog) = 9 echo "わんわん" 10 11proc cry(cat: Cat) = 12 echo "にゃーにゃー" 13 14proc letCry(animal: Animal) = 15 echo "鳴け!" 16 cry(animal) 17 18let dog = Dog() 19let cat = Cat() 20 21letCry(dog) 22letCry(cat)

このようになると思います。どちらも似たようなことをしていると思うのですが、ハッキリと別の言葉が使用されているあたり、何か違う概念に基づいているのだと思います。C++にもコンセプトという言葉があったり、Javaにもインターフェイスという言葉があると思いますが、具体的にどういう概念の違いなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一般的には、インタフェース(interface)よりもコンセプト(concept)の方が広い概念を指すと考えられます。

Go言語のinterface型は、「ある型が提供するメソッドの集合」を規定します。

An interface type specifies a method set called its interface. A variable of interface type can store a value of any type with a method set that is any superset of the interface. Such a type is said to implement the interface.

Nim言語のconceptは、「ある型が満たすべき要求の集合」を規定します。この要件は、“その型があるシグネチャを持つメソッドを有する”というインタフェース相当のものや、“その型の変数を用いたある式が有効”という表現能力を持ちます。

Concepts, also known as "user-defined type classes", are used to specify an arbitrary set of requirements that the matched type must satisfy.

Java言語のinterface型は、その表現能力という点ではGo言語のそれと同等(メソッドの集合)です。良し悪しはさておき、「定数」を宣言することもできます。

C++言語ではインタフェース型は提供されませんが、クラス(class)と仮想メンバ関数(virtual member function)によって同等概念を実現できます。C++20で導入予定のC++言語conceptは、Nim言語のそれと同等で「ある型が満たすべき要求の集合」を表現します。

投稿2018/05/30 01:57

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問