2

最近我遇到了一种情况,我需要为我的 android 应用程序创建一个自定义VideoView 。我需要访问 MediaPlayer 对象并添加一些侦听器。

不幸的是(对我来说),VideoView 类的所有成员都是私有的,所以即使扩展类也不能帮助我访问它的 MediaPlayer 对象(或其他任何东西),我不得不用我的修改。

好吧,虽然听起来我在抱怨“努力工作”,但在这种情况下它比扩展课程更容易(因为所有资源都可用......),但这让我真的怀疑这种信息方法隐藏。这比让主要组件可用于修改/访问(受保护,不公开)更好吗?我的意思是,我知道如果我扩展 VideoView 类,也许有一天他们会更改 VideoView 类中的某些内容,我可能会遇到麻烦,但如果他们会更改类,我自己的(重复)版本会有更大的不同来自 VideoView 类,我的目标不是创建自己的视频视图,而是扩展可用的 VideoView。

4

4 回答 4

4

在这种情况下,我通常更喜欢组合而不是继承。

编辑:
当子类和超类都在同一个程序员的控制下时,使用继承是安全的,但是实现继承会导致 API 脆弱。正如您所提到的,如果超类实现发生变化,那么子类可能会中断或更糟 - 会默默地做一些意想不到的事情。

另一种方法是让私有字段引用现有类 (VideoView) 的一个实例,称为组合,新类中的每个实例方法调用现有类的包含实例上的相应方法并返回结果。这种包装方法也可以称为“装饰器”模式

于 2011-04-24T14:08:31.240 回答
4

当程序员将某些东西设为私有时,他们是在打赌没有其他人需要使用或覆盖它,因此信息隐藏会带来回报。有时这个赌注不会成功。他们是休息时间。

于 2011-04-24T14:20:02.157 回答
1

我不能代表特定 VideoView 开发人员的推理,但如果您正在开发 API,并确定某些数据表示的状态需要始终遵循某些规则,以保持对象的完整性和预期目的,那么将成员变量设为私有是有意义的,这样您就可以控制它们的修改。

它确实限制了其他开发人员可以做的事情,但我认为这就是重点。如果要更改某些内容,您会希望它在对 API 进行治理的小组中进行讨论和验证。在这种情况下,私有化是有意义的,这样对它的修改就不会在集团的监督之外失控。

我不知道有一个静态的经验法则可以确定什么时候需要属于这一类,但我绝对可以看到在某些情况下的用途。

于 2011-04-24T14:05:33.613 回答
1

当我阅读所有有启发性的答案(和评论)并对那些人发表评论时,我意识到我期望一些与某些课程无关的东西。以 VideoView fr 为例,这个类已经是继承链中的最后一个。它不应该被扩展,因为它是一个逻辑单元,非常具体和非常紧凑,用于非常具体的目的。我的需要,从视图和 MediaPlayer 中获取特殊状态,是出于 QC 目的的需要,在提供封闭单元的产品时,确实不应该考虑这种需求(尽管源是开放的)。这是一个合理的论点,我觉得它令人满意。有时并非OOP 的每个概念都应该实现。谢谢大家的回复。

于 2011-04-24T20:14:05.947 回答