簡體   English   中英

我如何構建一個實現接口中受保護方法的系統?

[英]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()

但我不希望公開這種渲染方法。 我現在能做什么? 我很難過,因為這個類正在擴展其他類,所以不可能使用抽象類。

您可以利用SOLID原則中的I接口隔離原則

使用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>

遺憾的是,無法在接口中使用受保護的方法。 接口中的所有方法都是隱式 publicabstract 任何偏離該模式的嘗試都不會編譯。

盡管它們的外觀如下,但以下三種方法是隱含相同的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM