17. Interface
LuneScript does not support multiple inheritance of classes, but does support interfaces.
interface
If you've used Java or C#, you'll be familiar with it, but you can think of an interface as a class with limited functionality.
Specifically, interfaces differ from classes in the following ways:
- The declaration is an interface, not a class.
- has no members.
- All methods are abstract. Therefore, an interface cannot be instantiated by itself.
- A class that implements an interface has () in its extend
- A class can implement multiple interfaces
- Don't put override on the method of the class that implements the interface.
Here is an example interface:
// @lnsFront: ok
interface IF {
pub fn func();
}
class Test extend (IF) {
pub fn func() {
print( __func__ );
}
}
fn sub( obj:IF ) {
obj.func();
}
sub( new Test() ); // Test.func
This example defines an interface IF.
Here is an example class that implements two interfaces:
// @lnsFront: ok
interface IF1 {
pub fn func1();
}
interface IF2 {
pub fn func2();
}
class Test extend (IF1,IF2) {
pub fn func1() {
print( __func__ );
}
pub fn func2() {
print( __func__ );
}
}
fn sub( obj1:IF1, obj2:IF2 ) {
obj1.func1();
obj2.func2();
}
let mut test = new Test();
sub( test, test ); // Test.func Test.func2
If you implement multiple interfaces, declare them in () after extend .
By the way, as a restriction when implementing multiple interfaces, an error will occur if there are methods with the same name but different types in the interface to be implemented as follows.
// @lnsFront: error
interface IF1 {
pub fn func():int;
}
interface IF2 {
pub fn func():str;
}
class Test extend (IF1,IF2) { // mismatch IF1.func, IF2.func
}
Note that default processing of methods is not supported as a specification of the current interface.
summary
LuneScript does not support multiple inheritance of classes, but does support interfaces.
Next time, we will explain Mapping.