Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
field.nim(15, 14) Error: undeclared identifier: '..<'
package main
type MyType struct {
A int
B int
}
func (v MyType) Val() int {
return v.A + v.B
}
type MyType2 struct {
V int
}
func (v MyType2) Val() int {
return v.V
}
type HaveVal interface {
Val() int
}
func PrintVal(v HaveVal){
println(v.Val())
}
func main(){
a := MyType{A:1, B:2}
b := MyType2{V:5}
PrintVal(a)
PrintVal(b)
}
type
T1 = object
foo: string
T2 = object
bar: string
T3 = object
baz: string
method foobar(self: T1) =
echo self.foo
method foobar(self: T2) =
echo self.bar
proc foobarCaller[T](self: T) =
self.foobar()
var t1 = T1(foo: "T1")
var t2 = T2(bar: "T2")
var t3 = T3(baz: "T3")
foobar(t1) # компилируется, результат "T1"
foobar(t2) # компилируется, результат "T2"
foobar(t3) # не компилируется (!) Error: type mismatch: got (T3)
# but expected one of:
# interface_test.foobar(self: T2)
# interface_test.foobar(self: T1)
...
func main() {
a := MyType{A: 1, B: 2}
b := MyType2{V: 5}
var arr = []HaveVal{a, b}
for i := range arr {
println(arr[i].Val())
}
}
proc foo[T: MyType1|MyType2](x: T) = echo "do something"
type
A = ref object of RootObj
B = ref object of A
x: int
C = ref object of A
s: string
method `$`(v: A): string =
quit "to override!"
method `$`(v: B): string = $v.x
method `$`(v: C): string = v.s
var a: seq[A] = @[B(x:4), C(s:"Hello")]
for v in a:
echo v
In particular, preferring composition over inheritance is often the better design.Правда, примеров не густо.
Composition (has-a relation) is often preferable to inheritance (is-a relation) for simple code reuse. Since objects are value types in Nim, composition is as efficient as inheritance.
type
T1 = object
foo: string
T2 = object
bar: string
T3 = object
baz: string
method foobar(self: T1) =
echo self.foo
method foobar(self: T2) =
echo self.bar
proc foobar(i: int) =
echo "Int" & repr(i)
proc foobarCaller[T](self: T) =
self.foobar()
var t1 = T1(foo: "T1")
var t2 = T2(bar: "T2")
var t3 = T3(baz: "T3")
foobar(t1) # компилируется, результат "T1"
foobar(t2) # компилируется, результат "T2"
foobar(42) # компилируется, результат "Int42"
foobarCaller(t3) # не компилируется (!) Error: type mismatch: got (T3)
# but expected one of:
# interface_test.foobar(self: T2)
# interface_test.foobar(self: T1)
# interface_test.foobar(i: int)
Знакомство с Nim: пишем консольную 2048