On Thu, 02 Jun 2011 15:01:31 -0400, Michael Shulman
<viritril...@gmail.com> wrote:
On Thu, Jun 2, 2011 at 10:31 AM, Steven Schveighoffer
<schvei...@yahoo.com> wrote:
Private methods are non-virtual, so I'm pretty sure they are not
supposed to
be allowed in an interface.
But I suppose private could also mean private final, in which case you
have
to provide an implementation for foo in the interface.
In section 6.9.1 of "The D Programming Language" about Non-Virtual
Interfaces, there is an example (p214) of an interface which defines
two private methods without implementation. But now that you point it
out, that code also fails the linker for me. Is that book out of sync
with
the implementation?
I'm not sure, I don't have a copy of the book, so I'm not sure of the
context. I remember reading posts claiming that the book intends for
private methods to be virtual, but I can't be sure.
All I know is, the official position of D is that the book overrules the
current spec/implementation. So if it seems the book is not agreeing with
the current spec, it's likely a bug in the spec/compiler. If you believe
this to be the case, please file a bug on bugzilla
http://d.puremagic.com/issues/enter_bug.cgi Put [TDPL] at the beginning
of the summary.
This would be in line with the error message.
It is true that if I replace "private" with "final" I get the same
error message. That is also puzzling to me; I would expect a final
method in an interface without an implementation to be a *compiler*
error, since there is no way anyone else can implement it. Is there?
In D, you do not need to provide an implementation when declaring a
function. For example, if you want to hide the details of a function, you
can just declare it in a public file, but actually build your library with
a private file that contains the implementation. This way, the end-user
cannot see the source. .di files are supposed to be for this, but I think
in practice, .di and .d files are treated the same by the compiler.
You can see a great example of this in object.di included with the
compiler (src/druntime/import/object.di).
-Steve