« Return to Thread: [scala] Constructor parameters for traits
Andrés Testi wrote:But my example is yet valid. The compiler refuses my code because msg
in Sub1 was overriding msg in Sub2. Why not apply the same compiler
restrictions on trait constructors?
- Andrés
2008/12/2 Andrés Testi <andres.a.testi@gmail.com>:
> Oh, sorry, my code doesn't really works :-(
>
> 2008/12/2 Andrés Testi <andres.a.testi@gmail.com>:
>> But what about this?:
>>
>> trait Base{ val msg: String }
>> trait Sub1 extends Base{ override val msg = "hello" }
>> trait Sub2 extends Base{ override val msg = "goodbye" }
>> Object Test extends Sub1 with Sub2
>>
>> The above code works fine. Why not apply the same rules to solve
>> diamond inheritance?
>>
>> - Andrés
>>
>> 2008/12/2 James Iry <jamesiry@gmail.com>:
>>> Diamond inheritance creates extra complexity. Here's one example
>>>
>>> trait Base(val msg : String}
>>> trait Sub1 extends Base("hello")
>>> trait Sub2 extends Base("goodbye")
>>> Object Test extends Sub1 with Sub2
>>> println(Test.msg) // hello? goodbye? error?
>>>
>>> There are ways for a language to let you resolve diamond inheritance. But
>>> it does complicate things.
>>>
>>> On Tue, Dec 2, 2008 at 9:17 AM, Sebastien Braun <sebb@yellowhippy.org>
>>> wrote:
>>>>
>>>> Hello, List.
>>>>
>>>> I know that traits can not have constructor parameters, however I have not
>>>> been able to find out much about the rationale behind this restriction; my
>>>> google-fu fails me and the SLS is quiet on it (or, maybe, I just don't
>>>> know
>>>> where to look for it).
>>>>
>>>> For this scala code
>>>>
>>>> > trait A {
>>>> > System.out.println("Hello, World!")
>>>> > }
>>>> >
>>>> > class AImpl extends A
>>>>
>>>> scalac will generate (something closely resembling) the following
>>>> pseudo-Java:
>>>>
>>>> > public interface A {}
>>>> >
>>>> > public class A$class {
>>>> > public static void $init$(A $this) {
>>>> > System.out.println("Hello, World!");
>>>> > }
>>>> > }
>>>> >
>>>> > public class AImpl implements A {
>>>> > public A() {
>>>> > A$class.$init$(this);
>>>> > }
>>>> > }
>>>>
>>>> So, intuitively (and perhaps naïvely...), it seems to me that the compiler
>>>> should also be able to accept constructor parameters for traits:
>>>>
>>>> > trait A(message: String) {
>>>> > System.out.println(message)
>>>> > }
>>>>
>>>> and just tack on the arguments to the $init$ method of the trait's
>>>> implementation class:
>>>>
>>>> > public interface A {}
>>>> >
>>>> > public class A$class {
>>>> > public static void $init$(A $this, String message) {
>>>> > System.out.println(message);
>>>> > }
>>>> > }
>>>>
>>>> Is this a bad idea?
>>>>
>>>> Cheers,
>>>>
>>>> Sébastien
>>>
>>>
>>
>
« Return to Thread: [scala] Constructor parameters for traits
| Free embeddable forum powered by Nabble | Forum Help |