digitalmars.D - Public variables inside interfaces
- =?UTF-8?B?TWFyaXVzeiBHbGl3acWEc2tp?= (35/35) Apr 30 2011 I like the possibility of abandoning () in function calls in D, so we
- Peter Alexander (6/16) Apr 30 2011 No, interface functions require entries in the v-table, so the
- Olivier Pisano (27/27) Apr 30 2011 Hi,
I like the possibility of abandoning () in function calls in D, so we
can firstly make attribute public and then if implementation changes,
smoothly change it into function:
call:
<code>
auto a = new A();
writeln("Size is " +a.size);
auto b = new B();
writeln("Size is " +b.size);
class A {
public int size = 0;
}
class B {
public int size() { return 0; }
}
</code>
Although, if I'd like to make interface Sizeable, it's impossible to
treat attribute and method equally:
<code>
interface Sizeable {
/*
int size; // Error: variable Sizeable.size field not allowed in
interface
int size(); //
*/
class A : Sizeable {
public int size = 0; // Error: Does not implements int size()
}
class B : Sizeable {
public int size() { return 0; }
}
</code>
Is it possible to make it work?
Best regards,
Mariusz Gliwiński
Apr 30 2011
On 30/04/11 1:22 PM, Mariusz Gliwiński wrote:I like the possibility of abandoning () in function calls in D, so we can firstly make attribute public and then if implementation changes, smoothly change it into function: <snip> Although, if I'd like to make interface Sizeable, it's impossible to treat attribute and method equally: <snip> Is it possible to make it work? Best regards, Mariusz GliwińskiNo, interface functions require entries in the v-table, so the implementing class needs to have a function. You could certainly get around it using mixins and metaprogramming, but there's no need for that level of complexity when all you need to do is implement a function that returns a member variable.
Apr 30 2011
Hi,
You can "disguise" method calls into variables by using the property tag.
interface Sizeable
{
// Getter
property int size();
// Setter
property int size(int s);
}
class A : Sizeable
{
int m_size;
public:
this()
{
}
property int size() { return m_size; }
property int size(int s) {return m_size = s; }
}
static void main(string[] args)
{
A a = new A();
a.size = 20; // calls a.size(int);
int i = a.size + 10; // calls a.size()
}
Cheers,
Olivier.
Apr 30 2011









Peter Alexander <peter.alexander.au gmail.com> 