【问题标题】:OOP Design: getter method (or object) visibilityOOP 设计:getter 方法(或对象)的可见性
【发布时间】:2012-10-07 15:18:16
【问题描述】:

我目前正在编写一个 Android 游戏引擎库。基类(得到扩展)包含两个 WSLog 对象(Android Log 类方法的包装器)。一个叫做gameEngineLog(应该只在游戏引擎项目中可见),另一个叫做gameLog(应该在游戏引擎项目和实际游戏项目中可见)。

在基类中,您可以使用 getter 方法获取两个日志。

我已经通读了Controlling Access to Members of a Class 以了解哪些修饰符应该在getGameEngineLog() 前面以使其仅在游戏引擎项目中可见,但没有任何修饰符(公共、受保护、默认或私人)适合我的需要。

如何使gameEngineLog 对象仅在整个游戏引擎项目中可见,而在实际游戏项目中不可见?

注意:游戏引擎项目中的所有其他组件(类)都包含对基类的引用(有些位于不同的包中)。我想要的只是这些类具有对gameEngineLog 对象的引用。欢迎任何方法。

这是一个视觉表示:

提前致谢。

【问题讨论】:

  • 您确定protected 修饰符不适合您的需要吗?由于您的问题只需要使用protected 修饰符。我认为您应该再读一次。
  • protected 修饰符仍然会让游戏项目中的基类(扩展游戏引擎项目中的基类)继承 getGameEngineLog()。
  • @LukeTaylor.. 我想我错过了你的问题中的一些东西.. 让我再检查一下..
  • 这是一个好兆头,表明你的基类有太多的职责,应该至少分成两个不同的类。
  • 因为它作为两种类的超类,应该被隔离:来自游戏引擎的类和来自游戏本身的类。

标签: java android oop


【解决方案1】:

正如@JB Nizet 所说,似乎游戏引擎类和游戏类应该有不同的基类。这些类仍然可以共享一个共同的基类(具有getGameLog)。至少,游戏引擎类可能只有一个单独的子类。

如果只有这个基类的子类需要访问getGameEngineLog,那么它可以作为游戏引擎类的子类中的受保护成员引入。

如果打算从其他类(但仅限于游戏引擎中的类)调用它,并且 package-private 不会这样做,一种方法是为任何可以使用此日志的类提供一个提供访问权限的对象从游戏引擎对象到它。

例如,如果对日志的访问是从一个中心点控制的,并且执行不良的游戏必须不可能访问它(即使是通过黑客攻击),那么您的项目可以创建一个单例通过它完成所有日志记录,它可以(直接或间接)创建任何其他可以访问日志的对象,并为它们提供具有日志记录功能的对象。

实现提供对日志的访问的对象的一种方法是将其作为游戏引擎类的内部类的实例,并具有私有构造函数(以便只有游戏引擎可以创建它)。

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 2014-10-25
    • 1970-01-01
    • 2011-09-07
    • 2011-01-02
    • 2021-02-14
    • 2011-05-03
    • 2018-03-13
    • 2016-12-23
    相关资源
    最近更新 更多