Programming Languages - Interfaces
- Java interfaces are satisfied explicitly.
- C++ abstract classes need to be extended explicitly
- Go interfaces are satisfied implicitly. If a type defines all the methods of an interface, the type satisfies that interface.
- Rust:
trait
C++
C++ does not have a formal contruct for interfaces, it is achieved by defining a class with only pure virtual methods.
class Foo {
public:
virtual int bar(int a) = 0;
};
class FooImpl : public Foo {
// ...
}
Go
type Abser interface {
Abs() float64
}
Go interfaces are implemented implicitly. (There's no implements
keyword.)
interface{}
== any type. (Go 1.18 introduces an any
type as an alias to interface{}
).
Assertion: i
is an interface value, i.(T)
asserts that the underlying type is T
.
- if true,
t := i.(T)
assigns the value tot
. - if false:
- if
t := i.(T)
: panic. - if
t, ok := i.(T)
:ok
= false, no panic.
- if
Interface embedding:
type Reader interface {
Read(p []byte) (n int, err error)
}
type Writer interface {
Write(p []byte) (n int, err error)
}
// ReadWriter is the interface that combines the Reader and Writer interfaces.
type ReadWriter interface {
Reader
Writer
}
Rust
Rust uses trait
to define methods that classes can implement.
trait Foo {
fn bar(a: isize) -> isize;
}
struct FooImpl;
impl Foo for FooImpl {
fn bar(a: isize) -> isize {
return a;
}
}
Java
Java uses interface
keyword to define interfaces.
public interface Foo {
public int bar(int a);
}
class FooImpl implements Foo {
public int bar(int a) {
return a;
}
}
Starting from Java 8, you can implement default methods in interfaces; starting from Java 9, you can add private methods in interfaces.