当前位置: 首页 > 知识库问答 >
问题:

Java设计帮助.继承和共享代码

范豪
2023-03-14

我在编程开发方面仍然有点无所事事,在设计一个干净的设计时遇到了一些麻烦。具体来说,我有一个场景如下:

我有4个类,每个都有共同的功能。让我们称这些方法为A、B、C等。

类:帐户;方法:A,B,C,G,H,I,S1,S2,S3
类:文件夹;方法:A,B,C,D,E,S1,S2,S3
类:组;方法:A,B,C,D,E,F,S1,S2,S3
类:角色;方法:A,B,C,D,E,F,S1,S2,S3

上面指定的方法是抽象的。就像在可以有一个不同的实现方法A的FOU帐户和一个Bar帐户一样。然而FOU帐户和FOG有相同的方法A(因为它们的实现是相同的;Foo)。不算太糟,除了还有一些方法S1、S2和S3即使在Foo和Bar之间实现也是相同的,所以FOU帐户和Bar帐户有相同的方法S1、S2和S3。

目前我的设计相当难看:

接口对象1:声明A、B、C
接口对象2扩展对象1:声明D、E
接口对象3扩展对象2:声明F
接口帐户扩展对象1:声明G、H、I
接口文件夹扩展对象2
接口组扩展Object3
接口角色扩展Object3
类助手:定义S1、S2、S3

我知道禁止多重继承是有充分理由的,但是如果我被允许这样做,我可以将方法S1、S2和S3放入Object1,并将所有接口转换为摘要。

谁能给我一些建议,什么结构可能更好?我应该把所有的A,B,C等放在一个Util类中吗?

共有2个答案

劳研
2023-03-14

不要依赖继承作为减少重复代码的机制。相反,找出一种将责任划分为不同类别的方法。

FooAccount和FooGroup使用相同的方法A

这告诉我方法A的实现属于它自己的类(FOMA)。如果帐户公开方法A真的有意义,那么FOME. AFOFGroup. A的实现应该简单地传递给FOA. A

戈嘉慕
2023-03-14

您应该根据角色而不是发生情况对接口中的方法进行分组。所以假设ABC属于一个角色,DE属于另一个角色,F属于它自己

interface Role1 - A, B, C
interface Role2 - D, E
interface Role3 - F
interface Account extends Role1
interface Folder extends Role1, Role2
interface Group extends Role1, Role2, Role3

如果您有方法的通用实现,您可以将它们移动到提供默认实现的抽象基类

abstract class Helper - S1, S2, S3

然后你可以声明你的具体类

class FooAccount extends Helper implements Account

你也可以考虑使用泛型,如果你能提取到 Foo和<代码> Bar 的共同行为,并拥有<代码>帐号是一个泛型类(使用<代码> Foo和 Bar < /C> >而不是接口。

 类似资料:
  • 您可以使用共享文件夹 Microsoft 管理控制台 (MMC) 管理单元集中管理计算机上的文件共享。共享文件夹允许您创建文件共享和设置权限,查看和管理打开的文件以及连接到计算机上文件共享的用户。

  • 问题内容: 您如何处理在Java中仅具有单一继承的问题?这是我的具体问题: 我有三个(简化的)课程: 这是我认为最基本的实现,但是我想进行其他实现。 可以说我想添加一个新的变量,比如wordLength,但是我想使用继承来添加它。意思是我不想修改那个原始的AbstractWord类。即与此类似: 我知道java不允许我这样做,但是它使我的代码非常难看。现在,每当我添加一个字段时,我都将其添加到Ab

  • 实际上,我正在尝试在2个不同的插件项目中的2个portlet之间共享数据 以下是我分享数据的步骤: 步骤1:创建名为Senderproj的liferay插件项目,并在Senderport下创建一个portlet,然后在doView方法中编写以下代码 Step2:创建名为Receiverproj的增殖插件项目并创建一个名为Receiverport的portlet,然后在doView方法中编写下面的代

  • 直接从 Photoshop 内将您的创作快速通过电子邮件发送或共享到多个服务。 您现在可以直接从 Photoshop 内将您的创作通过电子邮件发送或共享到多个服务。在通过电子邮件共享文档时,Photoshop 将发出一个原始文档(.psd 文件)。对于某些特定服务和社交媒体渠道,在共享之前,Photoshop 会将文档自动转换为 JPEG 格式。 执行以下操作: 在 Photoshop 中,选择文

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 第六章 继承和面向对象设计 很多人认为,继承是面向对象程序设计的全部。这个观点是否正确还有待争论,但本书其它章节的条款数量足以证明,在进行高效的C++程序设计时,还有更多的工具听你调遣,而不仅仅是简单地让一个类从另一个类继承。 然而,设计和实现类的层次结构与C语言中的一切都有着根本的不同。只有在继承和面向对象设计领域,你才最有可能从根本上重新思考软件系统构造的方法。另外,C++提供了多种很令人困惑