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. ..