Re: Protected and package in iterface
Joshua Cranmer <Pidgeo...@verizon.invalid> wrote:
While not quite the same thing, this should be sufficient:
public class Car {
class PackageView implements Serviceable, Warranteeable {
// Methods, etc.
}
PackageView getPackageView() {
return new PackageView();
}
}
It's a cheap-ish hack, but it does a fair job of emulating C++'s
protected or private inheritance.
tam@milkyway.gsfc.nasa.gov wrote:
I'm sure there are ways to get around this but it seems like a lot of
work. E.g., wouldn't this mean that I need to define a PackageView
class inside each vehicle type (Bicycle, Trolley, Boat...)? It does
seem a bit hackish to me... It seems to obfuscate what would be a
straightforward inheritance tree.
Whatever. It took me about 15 minutes to work up this SSCCE in 3 files:
// testit/InnerFace.java
package testit;
/* p-p */ interface InnerFace
{
public void foo();
}
// testit/Fimpl.java
package testit;
/** Fimpl - .
*/
public class Fimpl implements Runnable
{
/** Keep the interface on the down-low.
*/
/* p-p */ static class NestedFimpl implements InnerFace
{
@Override
public void foo()
{
System.out.println( "NestedFimpl.foo()" );
}
}
private volatile InnerFace face;
/** No-arg constructor.
*/
public Fimpl()
{
this( null );
}
/* p-p */ Fimpl( InnerFace f )
{
face = (f == null? new NestedFimpl() : f);
}
/* p-p */ void setFace( InnerFace f )
{
face = (f == null? new NestedFimpl() : f);
}
/* p-p */ InnerFace getFace()
{
return face;
}
/** Delegate an action to <code>foo()</code>.
*/
@Override
public void run()
{
face.foo();
}
/** Main method.
* @param args <code>String []</code> program arguments.
*/
public static void main( String[] args )
{
Fimpl fimpl = new Fimpl();
fimpl.getFace().foo();
fimpl.run();
fimpl.setFace( new InnerFace()
{
@Override
public void foo()
{
System.out.println( " AnonyFace.foo()" );
}
});
fimpl.run();
}
}
// testit/other/TestFimpl.java
package testit.other;
import testit.Fimpl;
/** TestFimpl - .
*/
public class TestFimpl
{
/** Main method.
* @param args <code>String []</code> program arguments.
*/
public static void main( String [] args)
{
Fimpl fimpl = new Fimpl();
// InnerFace face = fimpl.getFace(); // not enough access rights
fimpl.run();
}
}
--
Lew