objects/class_only.vala \
objects/classes.vala \
objects/classes-interfaces.vala \
+ objects/classes-interfaces-virtuals.vala \
objects/classes-implicit-implementation.vala \
objects/compact-class.vala \
objects/compact-class-destructor.vala \
--- /dev/null
+interface IFoo : Object {
+ public abstract int foo ();
+}
+
+interface IBar : Object {
+ public abstract string foo ();
+}
+
+class Foo : Object, IFoo, IBar {
+ public virtual int IFoo.foo () {
+ return 42;
+ }
+ public string IBar.foo () {
+ return "foo";
+ }
+}
+
+class Bar : Foo {
+ public override int foo () {
+ return 23;
+ }
+}
+
+void main () {
+ var foo = new Foo ();
+ assert (foo.foo () == 42);
+ assert (((IBar) foo).foo () == "foo");
+
+ var bar = new Bar ();
+ assert (bar.foo () == 23);
+ assert (((Foo) bar).foo () == 23);
+ assert (((IFoo) bar).foo () == 23);
+ assert (((IBar) bar).foo () == "foo");
+}
}
base.add_method (m);
- // explicit interface method implementation
- if (m.base_interface_type != null) {
- scope.remove (m.name);
- scope.add (null, m);
- }
}
public HashMap<Method,Method> get_implicit_implementations () {
public override void add_method (Method m) {
methods.add (m);
members.add (m);
- scope.add (m.name, m);
+
+ // explicit interface method implementation
+ // virtual/abstract methods needs to be scoped and overridable
+ if (this is Class && m.base_interface_type != null && !(m.is_abstract || m.is_virtual)) {
+ scope.add (null, m);
+ } else {
+ scope.add (m.name, m);
+ }
}
/**