如何判断应该设计类、子类、抽象类或接口?

如何判断应该设计类、子类、抽象类或接口?

  • 1、设计新类
    • 1.1 原则
    • 1.2 解释
    • 1.3 示例
  • 2、设计子类
    • 2.1 原则
    • 2.2 解释
    • 2.3 示例
  • 3、设计抽象类额
    • 3.1 原则
    • 3.2 解释
    • 3.3 示例
  • 4、设计接口
    • 4.1 原则
    • 4.2 解释
    • 4.3 示例

来源:《Head First Java》第二版:227 页

1、设计新类

1.1 原则

如果新的类无法对其他的类通过 IS-A 测试时,就设计不继承其他类的类;

1.2 解释

  • IS-A 测试:如果新的类不能被合理地认为是另一个类的一种类型,则不应该使用继承。
  • 不使用继承:当新的类与现有类之间不存在 IS-A 关系时,应该避免继承。

1.3 示例

假设我们有两个类 VehicleBook,它们之间没有任何继承关系。

public class Vehicle {private String model;public void drive() {System.out.println("Driving the vehicle.");}
}public class Book {private String title;public void read() {System.out.println("Reading the book.");}
}

在这个例子中,Vehicle 类代表汽车或其他交通工具,而 Book 类代表书籍。很明显,一本书不是一种交通工具,因此 Book 类不应该继承 Vehicle 类。相反,它们是完全独立的类。

2、设计子类

2.1 原则

只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有的类;

2.2 解释

  • 特殊化版本:当新的类需要扩展或修改现有类的功能时,可以使用继承。
  • 覆盖或增加新方法:子类可以通过重写父类的方法或添加新方法来扩展功能。

2.3 示例

假设我们有一个 Vehicle 类,我们想要创建一个 Car 类,它是 Vehicle 类的一个特殊版本。

public abstract class Vehicle {private String model;public abstract void startEngine();public void drive() {System.out.println("Driving the vehicle.");}
}public class Car extends Vehicle {private String color;public Car(String model, String color) {this.model = model;this.color = color;}@Overridepublic void startEngine() {System.out.println("Starting the car's engine.");}public void setColor(String color) {this.color = color;}public String getColor() {return color;}
}

在这个例子中,Car 类继承了 Vehicle 类,并且实现了抽象方法 startEngine()。此外,Car 类还添加了新的方法 setColor()getColor() 来设置和获取颜色。

3、设计抽象类额

3.1 原则

当你需要定一个一群子类的模板,又不想让程序员初始化此模板时,设计出抽象的类给它们用;

3.2 解释

  • 模板:抽象类定义了一组方法,但不允许直接实例化。
  • 不允许初始化:抽象类不能被直接实例化,只能被继承。

3.3 示例

假设我们有一个 Shape 抽象类,它定义了 area()perimeter() 方法。

public abstract class Shape {public abstract double area();public abstract double perimeter();
}public class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}@Overridepublic double perimeter() {return 2 * Math.PI * radius;}
}

在这个例子中,Shape 是一个抽象类,它定义了 area()perimeter() 方法。Circle 类继承了 Shape 类,并实现了这些方法。由于 Shape 是抽象的,我们不能直接创建 Shape 类的实例。

4、设计接口

4.1 原则

如果想定义出类可以扮演的角色,使用接口。

4.2 解释

  • 角色:接口定义了一组方法,没有提供任何实现。
  • 实现多个接口:一个类可以实现多个接口,从而扮演多种角色。

4.3 示例

假设我们有一个 Flyable 接口,它定义了飞行能力,还有一个 Swimmable 接口,它定义了游泳能力。

public interface Flyable {void fly();
}public interface Swimmable {void swim();
}public class Duck implements Flyable, Swimmable {@Overridepublic void fly() {System.out.println("Duck is flying.");}@Overridepublic void swim() {System.out.println("Duck is swimming.");}
}

在这个例子中,Duck 类实现了 FlyableSwimmable 接口,这意味着它可以同时扮演会飞和会游泳的角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tof系统标定流程之四相位深度计算详解

1、芯片介绍 S5K33DX是一款高度集成的间接飞行时间(tof)传感器,旨在实现3d深度传感。S5K33DX具有VGA分辨率和7um像素。相机集成在tof系统中,该tof系统还包括由S5K33DX控制的红外(IR)波段调制光源。S5K33DX芯片包括解调tof像素阵列、模拟/混合信号处理电路,包括调制信号生…

黑马头条Day10-定时计算热点文章、xxl-job

一、今日内容 1. 需求分析 目前实现的思路:从数据库直接按照发布时间倒序查询 问题: 如果访问量比较大,直接查询数据库,压力较大新发布的文章会展示在前面,并不是热点文章 2. 实现思路 解决方案:把热点…

关于三星机玩游戏长时间不操作锁屏的解决办法

com.samsung.android.game.gametools 三星游戏助推器 主版机 问题描述: 在玩游戏是长时间不点击就会出现屏幕锁 经过测试抓取发现是三星的应用 三星系统的应用:三星游戏助推器 解决方案: 通过ADB命令停用系统应用 直接在adb命令中输入 adb shell pm di…

CCS(Code Composer Studio 10.4.0)编译软件中文乱码怎么解决

如果是所有文件都出现了中文乱码这时建议直接在窗口首选项中修改:选择"Window" -> "Preferences",找到"General" -> "Workspace",将"Text file encoding"选项设置为"Other&quo…

深度解析Linux-C——函数和内存管理

目录 函数指针: 指针函数: 参数为指针的函数: 参数为数组的函数: C语言内存管理 stdlib.h头文件常用函数介绍 1、局部变量 2、全局变量 3、 堆空间变量 4、静态变量 5、常量 函数指针: 指向函数的指针&#…

Linux文件与相关函数的知识点3

main函数参数 int main(int argc,char *argv[]) { return 0; } C语言规定了main函数的参数只能有两个,一个是argc,一个是argv并且,argc只能是整数,第二个必须是指向字符 串的指针数组。 argc: 参数表示命令行中参数的个数&#xff0…

Java实现七大排序(二)

一.交换排序 1.冒泡排序 这个太经典了&#xff0c;每个学编程都绕不开的。原理跟选择排序差不多&#xff0c;不过冒泡排序是直接交换。 public static void bubbleSort(int[] array){for (int i 0; i < array.length - 1; i) {for (int j 0; j < array.length-1-i; j…

域内攻击手法——AS-REP Roasting攻击和Kerberoasting攻击

一、AS-REP Roasting攻击 1、AS-REP Roasting攻击原理 AS-REP Roasting是一种对用户账户进行离线爆破的攻击方式。但是该攻击方式使用上比较受限&#xff0c;因为其需要用户账户设置不要求Kerberos 预身份验证选项&#xff0c;而该选项默认是没有勾选的。Kerberos 预身份验证…

20240727 每日AI必读资讯

&#x1f310;OpenAI向Google宣战&#xff0c;重磅推出AI搜索引擎SearchGPT &#xff01; - 将 AI 与实时网络信息结合 提供生成式UI结果 - SearchGPT 结合网络最新信息可以直接回答问题&#xff0c;同时注明相关来源链接。 - 还可以像与人对话一样提出后续问题&#xff0c;…

进程概念(三)----- fork 初识

目录 前言1. pid && ppid2. forka. 为什么 fork 要给子进程返回 0&#xff0c; 给父进程返回子进程的 pid &#xff1f;b. 一个函数是如何做到两次的&#xff1f;c. fork 函数在干什么&#xff1f;d. 一个变量怎么做到拥有不同的内容的&#xff1f;e. 拓展&#xff1a;…

SpringBoot Vue使用Jwt实现简单的权限管理

为实现Jwt简单的权限管理&#xff0c;我们需要用Jwt工具来生成token&#xff0c;也需要用Jwt来解码token&#xff0c;同时需要添加Jwt拦截器来决定放行还是拦截。下面来实现&#xff1a; 1、gradle引入Jwt、hutool插件 implementation com.auth0:java-jwt:3.10.3implementatio…

小红书电商首提“生活方式电商”定义,个性化需求也能做成好生意

近日&#xff0c;小红书发布COO柯南与经济学者薛兆丰的对谈视频。对谈中柯南首次对外定义&#xff0c;小红书电商是“生活方式电商”。 柯南表示&#xff0c;生活方式电商是让用户在小红书买到的&#xff0c;不仅是好产品&#xff0c;也是一种向往的生活。 随着生活方式的多元…

人工智能算法工程师(高级)课程5-图像生成项目之对抗生成模型与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程5-图像生成项目之对抗生成模型与代码详解。本文将介绍对抗生成模型(GAN)及其变体CGAN、DCGAN的数学原理,并通过PyTorch框架搭建完整可运行的代码,帮助读者掌握图像生成的原理和技术。 文章目录 一、GA…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

PID 控制实验 - 整定实验

Arduino PID Arduino-PID-LibraryArduino-PID-AutoTune-Library PID控制实验 – 制作测试台 PID Control Experiment – Making the Testing Rig PID (Proportional, Integral, Derivative) control is a classic control algorithm that I have used for a few projects,…

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么&#xff1f; ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜&#xff0c;如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

java学习--枚举

问题引入&#xff1a; 当需要解决一个季节类的问题&#xff0c;我们使用学到的类与对象&#xff0c;创建一个季节的类然后添加构造器在进行分装就可以实现&#xff0c;但问题也随之而来&#xff0c;这样不仅可以有正常的四季还可以添加其他不存在的四季以及可以更改四季的属性…

【Leetcode】十九、贪心算法:玩筹码 + 跳跃游戏

文章目录 1、贪心算法2、leetcode1217&#xff1a;玩筹码3、leetcode55&#xff1a;跳跃游戏 1、贪心算法 关于贪心算法中&#xff0c;“每一步都是最好的选择"的理解”。以零钱兑换为例&#xff0c;现在有1分、2分、5分的硬币&#xff0c;现在要凑出11分&#xff0c;且要…

masscan 端口扫描——(Golang 简单使用总结)

1. 前言 最近要做一个扫描 ip 端口的功能 扫描的工具有很多&#xff0c;但是如何做到短时间扫描大量的 ip 是个相对困难的事情。 市场上比较出名的工具有 masscan和nmap masscan 支持异步扫描&#xff0c;对多线程的利用很好&#xff0c;同时仅仅支持 syn 半开扫描&#xff…

采用先进的人工智能视觉分析技术,能够精确识别和分析,提供科学、精准的数据支持的明厨亮灶开源了。

明厨亮灶视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI技术可以24小时…