Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确地继承类和构造程序?_Java_Oop - Fatal编程技术网

Java 如何正确地继承类和构造程序?

Java 如何正确地继承类和构造程序?,java,oop,Java,Oop,我在为一个项目写东西。我有各种各样的世界物体(游戏中的真实物体——如矿石、树木等),它们都有各自的区域。铜矿石有一个区域列表,而铁矿石有另一个区域列表 有一段时间,我把矿石、树木等分类。然而,我意识到它们共享很多功能,本质上都是世界对象 例如,我可以查找最接近玩家级别的矿石或树木。我可能会查找离我最近的铜矿,或是离我最近的橡树 在每个单独的类中,我都有一个函数来完成这些事情。我意识到我根本没有利用OOP 我的问题是:你将如何设计和构造这样的东西 是否存在其他类从中扩展的WorldObject类

我在为一个项目写东西。我有各种各样的世界物体(游戏中的真实物体——如矿石、树木等),它们都有各自的区域。铜矿石有一个区域列表,而铁矿石有另一个区域列表

有一段时间,我把矿石、树木等分类。然而,我意识到它们共享很多功能,本质上都是世界对象

例如,我可以查找最接近玩家级别的矿石或树木。我可能会查找离我最近的铜矿,或是离我最近的橡树

在每个单独的类中,我都有一个函数来完成这些事情。我意识到我根本没有利用OOP

我的问题是:你将如何设计和构造这样的东西

是否存在其他类从中扩展的WorldObject类

区域由我静态定义。如何将区域附加到矿石类中的对象铜?我会使用一个单独的LookUpTable类来存储信息吗?area会是它自己的类吗?WorldObject类会继承它吗


我只是不明白如何在这个场景中应用OOP的原则,特别是作为一个新手。谢谢。

回答您的每个问题:

  • 你会如何设计和构造这样的东西

  • 是否存在其他类从中扩展的WorldObject类

  • 您可以将超类用于
    世界对象
    ,然后通过对象类进行扩展:

    public abstract class WorldObject { // Superclass
        // Private methods common to all world objects
        private int posx;
        private int posy;
        
        // Public methods common to all world objects
        public double distance(int x, int y);
    }
    
    public class Tree extends WorldObject { 
        // Inherited Methods
    }
    
    public class Ore extends WorldObject { 
        // Inherited Methods
    }
    
  • 区域由我静态定义
  • 我不知道你说的“区域”是什么意思?我假设它是对象的位置,您当然可以创建:

    public class Position {
        private int x;
        private int y;
        private int z; // if needed
        // Contructor, getters and setters
    }
    
    4A。铜矿石

    如果“铜矿石”与其他“矿石”相比具有“特殊”属性,则将其创建为从WorldObject或Ore类扩展而来的新类。如果只是具有不同的属性,则将这些属性添加到Ore类:

    public class Ore extends WorldObject { 
        private String type; // which may be "Copper", "Iron", etc.
        private double weight; // ....etc.
    
        // Inherited Methods
    }
    
    4B。如何将区域附加到矿石类中的对象铜?我会使用一个单独的LookUpTable类来存储信息吗

    使用世界对象列表,其中每个对象都有一个位置:

    public List<WorldObject> objects = new ArrayList<>();
    
    public List objects=new ArrayList();
    
    你不需要在你的案件中使用地图。映射通常在ID和对象关系中很有用,在这些关系中,您可以连续排序并快速找到所需的对象

  • area会是它自己的类吗?WorldObject类会继承它吗

  • 同样,我需要更多关于什么是“面积”的信息。不过,如果它只是位置,您可以将其作为字段包含在
    WorldObject

    中,如果我是您,我不会选择继承,因为它可能会在以后给您带来一些限制。例如,在java中不能有多个父对象,如果您想扩展另一个类,您会怎么做

    然而,在这种情况下,您可以设计您的层次继承来解决这种情况,但这并不总是(轻松地)可行的

    我的解决方案是:
    更喜欢接口而不是继承
    。您可以定义
    world
    接口,所有真实世界的对象都必须实现它