Rust では、インターフェース(interface)は trait を使用して定義されます。trait は抽象的な型であり、一連のメソッドのシグネチャを定義しますが、メソッドの実装は提供しません。Rust の型は trait を実装することができ、それによって、trait で定義されたメソッドを持つことを示すことができます。型が trait を実装すると、その型は trait を実装したインターフェースと見なすことができます。
以下は、シンプルな Rust の trait の例です:
trait Printable {
fn print(&self);
}
struct Person {
name: String,
}
impl Printable for Person {
fn print(&self) {
println!("Name: {}", self.name);
}
}
上記のコードでは、Printable という名前の trait を定義し、print という名前のメソッドを持っています。そして、Person という名前の構造体を定義し、Printable trait を実装しています。これにより、Person 型は Printable trait を実装したインターフェースと見なすことができ、print メソッドを呼び出すことができます。
他の言語でのインターフェースの実装方法は以下の通りです:
- Go 言語のインターフェース:Go 言語では、インターフェースは interface キーワードを使用して定義されます。インターフェースはメソッドのシグネチャの集まりを定義しますが、メソッドの実装は提供しません。Go の型はインターフェースを実装することができ、インターフェースのすべてのメソッドを実装するだけで、その型はそのインターフェースを実装したものと見なされます。以下は、シンプルな Go のインターフェースの例です:
type Printable interface {
Print()
}
type Person struct {
Name string
}
func (p Person) Print() {
fmt.Printf("Name: %s\n", p.Name)
}
上記のコードでは、Printable という名前のインターフェースを定義し、Print という名前のメソッドを持っています。そして、Person という名前の構造体を定義し、Printable インターフェースを実装しています。これにより、Person 型は Printable インターフェースを実装したものと見なされ、Print メソッドを呼び出すことができます。
- C 言語のインターフェース:C 言語では、インターフェースの概念はサポートされていません。ただし、関数ポインタと構造体を使用することで、インターフェースに似た機能を実現することができます。以下は、シンプルな C のインターフェースの例です:
typedef struct {
void (*print)(void* self);
} Printable;
typedef struct {
char* name;
} Person;
void person_print(void* self) {
Person* p = (Person*)self;
printf("Name: %s\n", p->name);
}
上記のコードでは、Printable という名前の構造体を定義し、print という名前の関数ポインタを含んでいます。そして、Person という名前の構造体を定義し、Printable インターフェースを実装しています。これにより、Person 型は Printable インターフェースを実装したものと見なされ、print メソッドを呼び出すことができます。
- C++ 言語のインターフェース:C++ 言語では、インターフェースは抽象クラスを使用して実現されます。抽象クラスは、少なくとも 1 つの純粋仮想関数を含むクラスです。純粋仮想関数は実装されていない仮想関数です。C++ の型は抽象クラスを実装することができ、抽象クラスのすべての純粋仮想関数を実装するだけで、その抽象クラスのインターフェースを実装したものと見なされます。以下は、シンプルな C++ のインターフェースの例です:
class Printable {
public:
virtual void print() = 0;
};
class Person : public Printable {
public:
Person(std::string name) : name(name) {}
virtual void print() {
std::cout << "Name: " << name << std::endl;
}
private:
std::string name;
};
上記のコードでは、Printable という名前の抽象クラスを定義し、print という名前の純粋仮想関数を持っています。そして、Person という名前のクラスを定義し、Printable 抽象クラスを実装しています。これにより、Person 型は Printable インターフェースを実装したものと見なされ、print メソッドを呼び出すことができます。
- Java 言語のインターフェース:Java 言語では、インターフェースは interface キーワードを使用して定義されます。インターフェースはメソッドのシグネチャの集まりを定義しますが、メソッドの実装は提供しません。Java の型はインターフェースを実装することができ、インターフェースのすべてのメソッドを実装するだけで、その型はそのインターフェースを実装したものと見なされます。以下は、シンプルな Java のインターフェースの例です:
interface Printable {
void print();
}
class Person implements Printable {
private String name;
public Person(String name) {
this.name = name;
}
public void print() {
System.out.println("Name: " + name);
}
}
上記のコードでは、Printable という名前のインターフェースを定義し、print という名前のメソッドを持っています。そして、Person という名前のクラスを定義し、Printable インターフェースを実装しています。これにより、Person 型は Printable インターフェースを実装したものと見なされ、print メソッドを呼び出すことができます。