[英]How can i build a system that achieves, what protected methods in interfaces would do?
我正在建立一个小的lwjgl库。
我有一个RenderController
,包含所有渲染对象和其他可渲染的对象 - 所以我采用了一个名为Renderable的接口 - 包含方法render()
和。 beforeRenderUpdate()
。 问题是:不应该允许库的用户调用RenderObject#update
,因为我希望lib单独管理渲染。 但是我想让用户拥有这个类的实例,因为它们有时会扩展AbstractMovableObject
,用户必须移动它们或请求统一更新。 因此,创建包含render方法的抽象类的选项是不可能的。 interfacr
的优点是,我在RenderController
有一个列表,对象<Renderable>(x).render()
。
但我不希望公开这种渲染方法。 我现在能做什么? 我很难过,因为这个类正在扩展其他类,所以不可能使用抽象类。
使用2个接口,一个用于公共内容,一个用于私有内容。 仅将对象公开给用户作为公共接口。 当您需要私有方法时,只需将其转换为其他接口。
package some.exposed.package;
public interface PublicRenderable {
public void publicRenderableMethod();
}
package some.package.you.dont.expose;
public interface PrivateRenderable {
public void privateRenderableMethod();
}
public class RenderObject implements PublicRenderable, PrivateRenderable {
public void publicRendereableMethod() {
// implementation
}
public void privateRenderableMethod() {
// implementation
}
}
package some.exposed.package;
public class PublicRenderObjectFactory {
public PublicRenderable getRenderable() {
return new RenderObject();
}
}
您的List
可以是List<PrivateRenderable>
。
遗憾的是,无法在接口中使用受保护的方法。 接口中的所有方法都是隐式 public
和abstract
。 任何偏离该模式的尝试都不会编译。
尽管它们的外观如下,但以下三种方法是隐含相同的。
public abstract void doSomething();
public void doSomething();
void doSomething();
但是,如果您声明任何明显与上述内容相矛盾的内容,则无法编译。 例如;
protected abstract void doSomething(); // Does not compile
public final void doSomething(); // Does not compile
一个简单的解决方案可能是使抽象类以某种方式适合该法案。 您可以尝试使用AbstractMovableObject
并且您的新AbstractRenderableObject
类都扩展了具有此受保护的update()
方法的第三个类(例如AbstractUpdatableObject
)? 这样他们既可以是BE-A AbstractUpdatableObject
,也可以是非常有限的关系(不超过他们实现相同界面时的关系),甚至可以有不同的update();
。
除了接口中的公共函数之外,没有办法创建任何东西。
正如您所说,您可以在抽象类中轻松实现受保护的函数。 你说这是不可能的,因为你的一些类必须扩展一个不相关的类。
因此,将受保护的方法放入RenderComposer
类中,这有助于组合 ,因此可以根据需要有效地扩展多个类。
像这样的东西:
public class RenderComposer { //DOES NOT implement Renderable
public RenderComposer() {
}
public void update_4prot() {
//...
}
}
public class SomeRederMover extends AbstractMovableObject implements Renderable {
private final RenderComposer renderer;
public SomeRederMover() {
renderer = new RenderComposer()
}
protected void update() {
renderer.update_4prot();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.