diff --git a/16_interfaces/casting.v b/16_interfaces/casting.v index 7b4c443..79398f1 100644 --- a/16_interfaces/casting.v +++ b/16_interfaces/casting.v @@ -2,21 +2,19 @@ struct Dog{ breed string - speak() string } -fn (d Dog) speak() string { - println('Woof') +fn (d Dog) speak() string{ + return 'Woof' } struct Cat{ breed string - speak() string } fn (c Cat) speak() string{ - println('Meow') + return 'Meow' } interface Something{} @@ -24,7 +22,7 @@ interface Something{} fn announce(s Something){ if s is Dog { - println('a ${s.breed] dog') + println('a ${s.breed} dog') }else if s is Cat{ println('a cat speaks ${s.speak()}') }else { diff --git a/16_interfaces/interface_example4.v b/16_interfaces/interface_example4.v new file mode 100644 index 0000000..91b71e1 --- /dev/null +++ b/16_interfaces/interface_example4.v @@ -0,0 +1,36 @@ +interface IFoo{ + foo() +} + +interface IBar{ + bar() +} + +struct SFoo{} + +fn (sf SFoo) foo() {} + + +struct SFooBar {} + +fn (sfb SFooBar) foo() {} + + +fn (sfb SFooBar) bar() { + dump('This implements IBar') +} + +fn main(){ + + mut arr := []IFoo{} + arr << SFoo{} + arr << SFooBar{} + + for a in arr{ + dump(a) + + if a is IBar{ + a.bar() + } + } +} \ No newline at end of file