monkey_tomato 2022-12-19 11:37 采纳率: 100%
浏览 167
已结题

java多态继承学的不太懂,求帮助

3、设计图形Shape类及其子类Circle和Rectangle类,它们的关系如图所示。

img

说明:

  1. Shape类是抽象类,其中getArea()、isContains()为抽象方法。getArea()计算图形的面积,isContains()判断某个点是否在图形内,由子类分别重写。print()方法为非抽象方法,打印指定范围内的在图形内的所有点,print()方法在Shape类中设计好,由子类继承实现代码的复用。
  2. Circle和 Rectangle类中均包含一个Point成员,标识圆的圆心以及矩形的左上角坐标(注意,屏幕的原点(0,0)在左上角)。isContains()方法借用Point类中的计算距离的相关方法判断某个点是否在图形内。
  3. Point类中的 getDistance()、getDistanceOfX ()、 getDistanc eOfY ()3个方法分别计算两个点间的距离,某个点到x轴的距离和某个点到y轴的距离。
    完成如下的设计:
    (1) 按说明完成 Shape类、Point类、Circle类、Rectangle类的设计。

    (2) 在测试类中定义一个Shape类型的数组,存入几个Circle类对象和 Rectangle类对象,并利用一个循环打印出所有图形的面积和图形,体会多态性的概念。

    按照面向接口编程的架构编写完成【例6-3】中用户管理系统前台代码。
    系统架构如图所示。

img

1)正确实现应用层 Application类依赖接口的编程方式。
2)组织应用层注册 registe()和登录 login()的业务流程。注册时要检查用户是否已存在,用户两次输入的密码是否一致。登录时对用户输入的用户名和密码进行验证。
注册、登录的工作过程如下:
注册用户
请输入用户名:lucy
请输入密码:1234
请重新输入密码:123
两次输入的密码不相符,请重新输入!
注册用户
请输入用户名:lucy
请输入密码:1234
请重新输入密码:1234
lucy,注册成功!
登录
请输入用户名:lucy
请输入密码:1234
lucy已登录

  • 写回答

2条回答 默认 最新

  • bingbingyihao 2022-12-19 12:53
    关注

    回答:第一个Shape类的UML图设计有一些问题,我修改了一点,代码如下

    img

    package test;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 11:53
     * @description
     */
    public abstract class Shape {
        /**
         * 计算图形面积
         *
         * @return 返回图形面积
         */
        public abstract double getArea();
    
        /**
         * 判断是否包含
         *
         * @param x x坐标
         * @param y y坐标
         * @return 返回是否包含,包含则返回true,不包含返回false
         */
        public abstract boolean isContains(int x, int y);
    
        public void print() {
            // 该处为默认实现,由子类进行重写
        }
    }
    
    package test;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 11:57
     * @description
     */
    public class Point {
        private int x;
        private int y;
    
        public Point() {
        }
    
        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }
    
        public int getX() {
            return x;
        }
    
        public int getY() {
            return y;
        }
    
        public double getDistance(int x, int y) {
            return Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2));
        }
    
        public double getDistanceOfX(int x) {
            return Math.abs(x);
        }
    
        public double getDistanceOfY(int y) {
            return Math.abs(y);
        }
    }
    
    package test;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 11:54
     * @description
     */
    public class Circle extends Shape {
        private final Point point;
        private final double r;
    
        public Circle(Point point, double r) {
            this.point = point;
            this.r = r;
        }
    
        @Override
        public double getArea() {
            return Math.PI * r * r;
        }
    
        @Override
        public boolean isContains(int x, int y) {
            return point.getDistance(x, y) < r;
        }
    
        @Override
        public void print() {
            System.out.println("圆形的面积为:" + getArea());
        }
    }
    
    package test;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 11:54
     * @description 实际设计有问题,point里面的方法太少了,且无法判断正负值
     */
    public class Rectangle extends Shape {
        private final Point point;
        private final double width;
        private final double height;
    
        public Rectangle(Point point, double width, double height) {
            this.point = point;
            this.width = width;
            this.height = height;
        }
    
        @Override
        public double getArea() {
            return width * height;
        }
    
        @Override
        public boolean isContains(int x, int y) {
            return x - point.getX() < width && y - point.getY() < height;
        }
    
        @Override
        public void print() {
            System.out.println("矩形的面积为:" + getArea());
        }
    }
    
    package test;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:18
     * @description
     */
    public class Test {
        public static void main(String[] args) {
            Shape[] shape = new Shape[4];
            shape[0] = new Circle(new Point(3, 3), 3);
            shape[0].print();
    
            shape[1] = new Rectangle(new Point(3, 3), 3, 4);
            shape[1].print();
    
            shape[2] = new Circle(new Point(3, 3), 4);
            shape[2].print();
    
            shape[3] = new Rectangle(new Point(3, 3), 3, 5);
            shape[3].print();
        }
    }
    

    第二个用户管理前台代码如下

    img

    package login;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:34
     * @description
     */
    public interface UserDao {
        /**
         * 添加用户
         *
         * @param user 要添加的用户
         * @return 返回用户是否添加成功
         */
        boolean addUser(User user);
    
        /**
         * 获取用户
         *
         * @param userName 用户名
         * @param password 密码
         * @return 返回获取到的用户
         */
        User getUser(String userName, String password);
    }
    
    package login;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:35
     * @description
     */
    public class User {
        private String userName;
        private String password;
    
        public User() {
        }
    
        public User(String userName, String password) {
            this.userName = userName;
            this.password = password;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    }
    
    package login;
    
    import java.util.Objects;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:34
     * @description
     */
    public class UserDaoForArray implements UserDao {
        private final User[] data = new User[10];
        private int count = 0;
    
        public UserDaoForArray() {
        }
    
        @Override
        public boolean addUser(User user) {
            if (getUser(user.getUserName(), user.getPassword()) == null) {
                data[count++] = user;
                return true;
            }
            return false;
        }
    
        @Override
        public User getUser(String userName, String password) {
            for (int i = 0; i < count; i++) {
                if (Objects.equals(data[i].getUserName(), userName) && Objects.equals(data[i].getPassword(), password)) {
                    return data[i];
                }
            }
            return null;
        }
    }
    
    package login;
    
    import java.util.Objects;
    import java.util.Scanner;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:34
     * @description
     */
    public class Application {
        private UserDao userDao;
    
        public Application(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        public void register() {
            Scanner scanner = new Scanner(System.in);
            System.out.print("请输入用户名:");
            String userName = scanner.next();
    
            System.out.print("请输入密码:");
            String password = scanner.next();
    
            System.out.print("请重新输入密码:");
            String repeatPassword = scanner.next();
    
            if (Objects.equals(password, repeatPassword)) {
                if (userDao.addUser(new User(userName, password))) {
                    System.out.println(userName + "注册成功");
                } else {
                    System.out.println(userName + "已存在,不能再次注册");
                }
            } else {
                System.out.println("两次输入的密码不相符,请重新输入");
            }
        }
    
        public void login() {
            Scanner scanner = new Scanner(System.in);
            System.out.print("请输入用户名:");
            String userName = scanner.next();
    
            System.out.print("请输入密码:");
            String password = scanner.next();
    
            if (userDao.getUser(userName, password) != null) {
                System.out.println(userName + "已登录");
            } else {
                System.out.println(userName + "未登录");
            }
        }
    }
    
    package login;
    
    import java.util.Scanner;
    
    /**
     * @author bbyh
     * @date 2022/12/19 0019 12:50
     * @description
     */
    public class Test {
        public static void main(String[] args) {
            UserDao userDao = new UserDaoForArray();
            Application application = new Application(userDao);
    
            boolean flag = true;
            Scanner scanner = new Scanner(System.in);
    
            while (flag) {
                System.out.println("1、登录");
                System.out.println("2、注册");
                System.out.println("3、退出系统");
                System.out.print("请输入选项:");
    
                int choice = scanner.nextInt();
                switch (choice) {
                    case 1:
                        application.login();
                        break;
                    case 2:
                        application.register();
                        break;
                    case 3:
                        flag = false;
                        break;
                    default:
                        break;
                }
                System.out.println();
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月19日
  • 已采纳回答 12月19日
  • 创建了问题 12月19日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加