[英]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.