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

Reply via email to