Re: [Vala] Is there any way to access generic type from the interface?



If you want your interface to provide, not just default implementations,
but methods your classes should not need to implement they self, use
virtual methods, you can provide an implementation for this method your
derived classes don't need to implement but inherited. Static methods can
be used to be reused if you want.
El feb. 28, 2016 4:31 PM, "Felipe Lavratti" <felipelav gmail com> escribió:

Even better, try this main instead the previous:

int main () {

    IMixinInterface fooer = new NothingSpecialFooer();
    fooer.foo();

    fooer = new TheSpecialFooer();
    fooer.foo();

    return 0;
}

Here we use the interface as the type of the object to show
polymorphism with mixin happening.

It prints:

$ ./test
** Message: test.vala:5: fooed defaulty!
** Message: test.vala:13: dummy string
** Message: test.vala:22: fooed specially!



On Sun, Feb 28, 2016 at 7:24 PM, Felipe Lavratti <felipelav gmail com>
wrote:
Right, I see what u are asking now.

Well, if you want to do Mixins in Vala, you'll have to do the "static"
workaround, since it doesn't support by default:

https://wiki.gnome.org/Projects/Vala/Tutorial#Mixins_and_Multiple_Inheritanae

Now you want to do Mixing with Generics? Ok, add the generic argument to
each  Mixin method of your interface:

public interface IMixinInterface : Object {
    public abstract void foo();

    public static T default_fooing<T>(T arg) {
        GLib.message("fooed defaulty!");
        return arg;
    }
}

public abstract class BaseFooer : Object, IMixinInterface {
    public virtual void foo() {
        var dummy_string = IMixinInterface.default_fooing<string>("dummy
string");
        GLib.message(dummy_string);
    }
}

public class NothingSpecialFooer : BaseFooer {
}

public class TheSpecialFooer : BaseFooer {
    public override void foo() {
        GLib.message("fooed specially!");
    }
}

int main () {

    var fooer = new NothingSpecialFooer();
    fooer.foo();

    var fooer2 = new TheSpecialFooer();
    fooer2.foo();

    return 0;
}


This example doesn't cover BaseFooer taking a generic argument, if the
example is not enough, please provide me more details about how is the
generic argument used in BaseFooer.

- Fanl





--
Skype: felipeanl



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]