简单共享方法是否需要接口?

Are interfaces necessary for simple shared methods?

仅因为一组对象共享几个 public 方法而使用接口是否有任何好处?

例如,我有 GameObjectGameComponentGameLevel。每个都有函数 onUpdate()onDraw().

我是否应该创建一个包含 onUpdate()onDraw()IGameEntity 接口并让每个对象实现它?我无意存储任何类型的 IGameEntity 列表或任何我只需要访问这两个函数的类似情况,那么这种抽象级别是否具有建设性?

如果您在 classes 中对这些方法有不同的实现,您应该使用接口,另一方面,如果您有方法的基本实现,则可以使用抽象 class.

如果这三个类需要onUpdate()onDraw()方法,那么是的,你需要创建接口并实现它。换句话说,您无法确定所有三个 类 都有 onUpdate()onDraw() 实现。 并且调用接口为 IGameEntityFunction.

会更好

不,这样做没有任何好处。这是关键声明:

I don't have an intention of storing any kind of list of IGameEntity's or any similar situation where I only need access to those two functions.

接口的目的是解耦意图实现。这允许消费者在不引入对实现的依赖的情况下调用接口方法。它还允许在不影响消费者的情况下替换新的实现。

但所有这些优势仅适用于如果有人正在使用该界面。如果一组异构实现者没有用处(例如 IGameEntity 对象的列表),则该接口不提供任何价值。 (事实上​​ ,界面的存在可能会让消费者相信他们 应该 使用 IGameEntity 对象的列表,而没有理由这样做。)

您可能不需要费心,因为您可以在以后需要时重构它。 (除非代码是 public API 的一部分,在这种情况下应考虑其用户。)

接口是对类型的有意义的约束。通常,我会说名为 IGameEntity 的接口听起来有问题。 是什么呢?从它的功能上来说,它还不如叫IUpdatableDrawable,但这个名字已经表明它会是个怪人。有时有必要引入这样的概念,但这是在可读性方面的代价,只有在有充分理由的情况下才应该付出代价。

一个好的界面为一组属于一起的功能命名。就像在口头语言中一样,没有用例命名一个概念毫无意义。