static member and/or @property ?
ag0aep6g via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu May 19 08:33:21 PDT 2016
On 05/19/2016 05:04 PM, chmike wrote:
> interface AThing { ??? string name ??? }
>
> class OneThing : AThing { ??? string name ??? "OneThing" ??? }
>
> class OtherThing : AThing { ??? string name ??? "OtherThing" ??? }
>
>
> void main()
> {
> // Accessing name as static information
> writeln(OneThing.name ??? );
>
> // Accessing name through polymorphism
> AThing tbl;
> tbl ~= new OneThing;
> tbl ~= new OtherThing;
> tbl ~= new OneThing;
> foreach(a; tbl) writeln(a.name???);
> }
>
> The only viable solution I found so far is by using distinct member
> names. In the interface we define name as a property, and in the class
> we define the static member with another name. Is it possible to avoid
> the different names ?
Here's what I could come up with. I wouldn't be surprised if there was a
simpler way to do it.
----
interface AThing
{
final string name() { return nameImpl(); }
string nameImpl();
}
class OneThing : AThing
{
static string name() { return "OneThing"; }
override string nameImpl() { return name(); }
}
class OtherThing : AThing
{
static string name() { return "OtherThing"; }
override string nameImpl() { return name(); }
}
void main()
{
import std.stdio;
// Accessing name as static information
writeln(OneThing.name);
// Accessing name through polymorphism
AThing[] tbl;
tbl ~= new OneThing;
tbl ~= new OtherThing;
tbl ~= new OneThing;
foreach(a; tbl) writeln(a.name);
}
----
Can use a mixin template to reduce the boilerplate:
----
interface AThing
{
final string name() { return nameImpl(); }
string nameImpl();
mixin template nameMixin()
{
static string name() { return typeof(this).stringof; }
override string nameImpl() { return name(); }
}
}
class OneThing : AThing { mixin AThing.nameMixin; }
class OtherThing : AThing { mixin AThing.nameMixin; }
----
More information about the Digitalmars-d-learn
mailing list