doc: update the interface sections (#12225)
parent
b23984a211
commit
3af53e29c9
70
doc/docs.md
70
doc/docs.md
|
@ -2663,9 +2663,54 @@ for item in arr {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Implement an interface
|
||||||
|
|
||||||
A type implements an interface by implementing its methods and fields.
|
A type implements an interface by implementing its methods and fields.
|
||||||
There is no explicit declaration of intent, no "implements" keyword.
|
There is no explicit declaration of intent, no "implements" keyword.
|
||||||
|
|
||||||
|
An interface can have a `mut:` section. Implementing types will need
|
||||||
|
to have a `mut` receiver, for methods declared in the `mut:` section
|
||||||
|
of an interface.
|
||||||
|
```v
|
||||||
|
module main
|
||||||
|
|
||||||
|
pub interface Foo {
|
||||||
|
write(string) string
|
||||||
|
}
|
||||||
|
|
||||||
|
// => the method signature of a type, implementing interface Foo should be:
|
||||||
|
// `pub fn (s Type) write(a string) string`
|
||||||
|
|
||||||
|
pub interface Bar {
|
||||||
|
mut:
|
||||||
|
write(string) string
|
||||||
|
}
|
||||||
|
|
||||||
|
// => the method signature of a type, implementing interface Bar should be:
|
||||||
|
// `pub fn (mut s Type) write(a string) string`
|
||||||
|
|
||||||
|
struct MyStruct {}
|
||||||
|
|
||||||
|
// MyStruct implements the interface Foo, but *not* interface Bar
|
||||||
|
pub fn (s MyStruct) write(a string) string {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
s1 := MyStruct{}
|
||||||
|
fn1(s1)
|
||||||
|
// fn2(s1) -> compile error, since MyStruct does not implement Bar
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fn1(s Foo) {
|
||||||
|
println(s.write('Foo'))
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn fn2(s Bar) { // does not match
|
||||||
|
// println(s.write('Foo'))
|
||||||
|
// }
|
||||||
|
```
|
||||||
|
|
||||||
#### Casting an interface
|
#### Casting an interface
|
||||||
|
|
||||||
We can test the underlying type of an interface using dynamic cast operators:
|
We can test the underlying type of an interface using dynamic cast operators:
|
||||||
|
@ -2721,6 +2766,31 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Embedded interface
|
||||||
|
|
||||||
|
Interfaces support embedding, just like structs:
|
||||||
|
|
||||||
|
```v
|
||||||
|
pub interface Reader {
|
||||||
|
mut:
|
||||||
|
read(mut buf []byte) ?int
|
||||||
|
}
|
||||||
|
|
||||||
|
pub interface Writer {
|
||||||
|
mut:
|
||||||
|
write(buf []byte) ?int
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReaderWriter embeds both Reader and Writer.
|
||||||
|
// The effect is the same as copy/pasting all of the
|
||||||
|
// Reader and all of the Writer methods/fields into
|
||||||
|
// ReaderWriter.
|
||||||
|
pub interface ReaderWriter {
|
||||||
|
Reader
|
||||||
|
Writer
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Function Types
|
### Function Types
|
||||||
|
|
||||||
You can use type aliases for naming specific function signatures - for
|
You can use type aliases for naming specific function signatures - for
|
||||||
|
|
Loading…
Reference in New Issue