繁体   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