I see interfaces with default implementation as a anti-pattern, actually. I
don't use it. Also, IMHO mixins are good for utility code, other than that
it might smell.

Maybe vala should have a literal mixin, with only virtual methods and not
instantiable nor castable. Only useful to add utility methods into classes.
On Sun, Feb 28, 2016 at 22:50 Daniel Espinosa <eso...@gmail.com> wrote:

> 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" <felipe...@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 <felipe...@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
>>
>
_______________________________________________
vala-list mailing list
vala-list@gnome.org
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to