Java 返回私有嵌套类实例的抽象类
我想要一个抽象类Java 返回私有嵌套类实例的抽象类,java,Java,我想要一个抽象类A public abstract class A { ... private static class B extends A { ... public interface IB {...} 然后我想要一个只能由a实例化的类B。没有其他人可以访问B——只有A public abstract class A { ... private static class B extends A { ... public interface IB {..
A
public abstract class A {
...
private static class B extends A {
...
public interface IB {...}
然后我想要一个只能由a
实例化的类B
。没有其他人可以访问B
——只有A
public abstract class A {
...
private static class B extends A {
...
public interface IB {...}
然后我希望A
有一个返回B
实例的方法
我的尝试:
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
private class B {
}
}
这当然行不通。如何实现这一点?有一个接口(
B接口
可能),列出调用代码在B
实例上可能使用的方法。写入B实现BInterface
。然后给getInstanceOfB()
一个返回类型BInterface
。然后可以从其他类使用它,然后其他类可以对返回的任何对象调用BInterface
中列出的方法。您可以通过将类B
设置为私有静态
来做您想做的事情:
public abstract class A {
...
private static class B {
...
}
}
如果类B
不是static
,则应该有A
的实例来访问B
。如果要实例化B
而不实例化A
,则应将内部类设置为静态
也许有原因使A
成为abstract
和B
成为私有的内部类。我认为其意图是只公开接口并隐藏具体的实现类型。因为抽象类用于子类化,所以可以通过将B
作为A
的子类型并在A
中声明公共接口来实现
public abstract class A {
...
private static class B extends A {
...
public interface IB {...}
现在,您可以在A
范围之外创建B
的实例,只要将对象的类型指定为A
,如下所示:
A b = A.getInstanceOfB();
最好从方法名中删除特定类型的符号,并通过传递参数来指定它
A b = A.getInstance(...);
您可以在getInstance()
factory方法中创建所需类型的对象作为指定参数
A b = A.getInstance(...);
好的,如果A
不应该这样使用,您可以为类B
声明一个公共接口,并将其用作A
范围之外的B
类型
public abstract class A {
...
private static class B extends A {
...
public interface IB {...}
及
您应该将B
设置为公共,但使用包私有构造函数:
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
}
public class B {
B(){}
}
使私有类成为静态类消除了eclipse中产生的错误
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
private static class B {
}
}
那是不对的。如果没有A的对象,就不能实例化B,除非B是static@GV他把它完全变成了一个独立的类——它不再是一个内部类了。你的评论不对。遗漏了这一点,我的错误在调用代码中返回的变量类型是什么?我想,调用这个类之外的代码必须是Object
,但是B
不是很有用。您甚至不能将其重新转换为B
。对不起,我真的很愤世嫉俗。我以前也尝试过这种方法,但没有任何效果。将实际的类设为公共类,将构造函数设为私有类<代码>A仍然可以看到构造函数。这是错误的,因为从外部看不到B。“你打算如何在类之外的其他地方使用result object?”DavidWallace前两名投票人可能同意答案,然后其他人也跟着潮流走了。@mikeyaworski没问题。我没有否决这个答案(但我考虑过),因为里面有好东西的种子。我想它只是需要一些工作。