Converting multiple inheritance code into C ++ for D language

Jean Cesar via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Feb 18 11:05:14 PST 2017


On Saturday, 18 February 2017 at 16:27:51 UTC, biozic wrote:
> On Saturday, 18 February 2017 at 12:56:51 UTC, wiki wrote:
>> On Saturday, 18 February 2017 at 09:33:25 UTC, biozic wrote:
>>> A mixin can be used to provide an base implementation for the 
>>> methods of an interface, along with data members, so that you 
>>> don't have to define it in every class that implements the 
>>> interface.
>>>
>>> An example : https://dpaste.dzfl.pl/b656851e5c51
>>
>>
>>
>> I tried to use it in the same way but I did not understand 
>> correctly because to simulate, alias in this code I had 
>> already defined the classes as interfaces but I did not 
>> understand how these constructors should be declared for later 
>> use ..
>
> There are multiple typos problems with your code. For me, the 
> main problem would be that this code is using OOP the wrong 
> way, but maybe this code doesn't represent what you actually 
> want to do... Anyway, see a corrected version below.
>
> import std.stdio;
>
> class Test1
> {
>     protected string _msg1;
>
>     this(string msg1)
>     {
>         _msg1 = msg1;
>     }
> } // No semicolon
>
> interface Test2
> {
>     // Interfaces can't have data members
>
>     // This template could actually be out of the interface.
>     // I just put it here because it's more clear that it's 
> related to Test2.
>     mixin template Impl()
>     {
>         protected string _msg2; // Data member is inside the 
> template
>
>         // This function is not a constructor. Only the class 
> implementing
>         // the interface will have one.
>         void thisTest2(string msg2)
>         {
>             _msg2 = msg2;
>         }
>     }
> }
>
> interface Test3
> {
>     mixin template Impl()
>     {
>         protected string _msg3;
>         void thisTest3(string msg3)
>         {
>             _msg3 = msg3;
>         }
>     }
> }
>
> class Test4 : Test1, Test2, Test3
> {
>     mixin Test2.Impl;
>     mixin Test3.Impl;
>
>     string _msg4;
>
>     this(string msg1, string msg2, string msg3, string msg4)
>     {
>         super(msg1);  // Calls the constructor of Test1
>         thisTest2(msg2); // Use interface Test2
>         thisTest3(msg3); // Use interface Test3
>         this._msg4 = msg4; // Test4 implementation
>     }
>
>     void show() // Don't use override here
>     {
>         writeln(_msg1, _msg2, _msg3, _msg4);
>     }
> }
>
> void main()
> {
>     auto teste = new Test4("\n\tTeste1 ", "Teste2 ", "Teste3 ", 
> "Teste4");
>     teste.show();
>     // No explicit return is required
> }

This is exactly what I want this code I did to understand how 
would apply multiple inheritance in D, C # also process using 
interfaces but the difference from C # to D is that C # already 
in the base class you have to define it as interface. ..


More information about the Digitalmars-d-learn mailing list