我想要一个抽象类A
。
然后我想要一个只能由B
实例化的类A
。没有其他人可以访问B
- 仅A
。
然后我希望A
有一个返回B
。
我的尝试:
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
private class B {
}
}
这当然不起作用。我怎样才能做到这一点?
答案 0 :(得分:5)
您可以将课程B
设为private static
:
public abstract class A {
...
private static class B {
...
}
}
如果课程B
不是static
,您应该有一个A
的实例来访问B
。如果要在不实例化B
的情况下实例化A
,则应创建内部类static
。
或许有理由将A
作为abstract
和B
作为私人内部类。我认为内容是你只想暴露接口并隐藏具体的实现类型。因为抽象类是用于子类化的,所以可以通过将B
作为A
的子类型来实现,并在A
中声明公共接口。
public abstract class A {
...
private static class B extends A {
...
现在,只要您将对象的类型指定为B
,就可以在A
范围之外创建A
的实例,如下所示:
A b = A.getInstanceOfB();
最好从方法名称中删除特定类型的符号,并通过传递参数来指定它。
A b = A.getInstance(...);
您可以在getInstance()
工厂方法中创建所需类型的对象作为指定参数。
好吧,如果A
不应该像这样使用,您可以为类B
声明一个公共接口,并将其用作范围之外的B
类型A
。
public interface IB {...}
和
public abstract class A {
...
private static class B implements IB {
...
答案 1 :(得分:1)
在BInterface
的实例上有一个接口(可能是B
),列出了调用代码可能使用的方法。写B implements BInterface
。然后为getInstanceOfB()
提供BInterface
的返回类型。然后可以从其他类中使用它,然后其他类可以调用BInterface
中列出的方法,无论返回什么对象。
答案 2 :(得分:1)
你应该公开B
,但是使用包私有构造函数:
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
}
public class B {
B(){}
}
答案 3 :(得分:0)
使私有类静态删除了在eclipse中产生的错误。
public abstract class A {
public static B getInstanceOfB() {
return new B();
}
private static class B {
}
}