Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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多态子类Functioncall_Java_Polymorphism_Subclass - Fatal编程技术网

Java多态子类Functioncall

Java多态子类Functioncall,java,polymorphism,subclass,Java,Polymorphism,Subclass,我很确定我能找到关于Stackoverflow这个问题的答案。不幸的是,我不知道这样做的具体提法 鉴于下面的代码,我有一个问题,那就是我想避免类型检查。这些评论可能比我的话更能描述它 现在我正在尝试建立一个形状系统,其中每个形状都可以与每个可能的特定形状发生碰撞。 碰撞等级: public class ShapeCollision { public static boolean intersects(RectShape rectShape1, RectShape rectShape2)

我很确定我能找到关于Stackoverflow这个问题的答案。不幸的是,我不知道这样做的具体提法

鉴于下面的代码,我有一个问题,那就是我想避免类型检查。这些评论可能比我的话更能描述它

现在我正在尝试建立一个形状系统,其中每个形状都可以与每个可能的特定形状发生碰撞。 碰撞等级:

public class ShapeCollision {
    public static boolean intersects(RectShape rectShape1, RectShape rectShape2) { return true; }

    public static boolean intersects(LineShape lineShape, RectShape rectShape) { return true; }

    public static boolean intersects(RectShape rectShape1, Shape shape) { return true; }

    public static boolean intersects(LineShape lineShape, Shape shape) { return true; }

    public static boolean intersects(Shape shape1, Shape shape2){ return true; }
}
形状分类:

public class RectShape extends Shape {
    Vector size;
    public RectShape(Vector pos, Vector size) {
        super(pos);
        this.size = size;
    }
    @Override
    public boolean intersects(IShape shape) {
        return ShapeCollision.intersects(this, shape);
    }
}

public class LineShape extends Shape {
    Vector pos2;
    public LineShape(Vector pos, Vector pos2) {
        super(pos);
        this.pos2 = pos2;
    }
    @Override
    public boolean intersects(IShape shape) {
        return ShapeCollision.intersects(this, shape);
    }
}

public class Shape implements IShape {
    protected Vector pos;
    public Shape(Vector pos) {
        this.pos = pos;
    }
    @Override
    public Vector getPos() {
        return pos;
    }
    @Override
    public void setPos(Vector pos) {
        this.pos = pos;
    }
    @Override
    public void move(Vector movementAmount) {
        pos.add(movementAmount);
    }
    @Override
    public boolean intersects(IShape shape) {
        return ShapeCollision.intersects(this, shape);
    }
}
以下是让我困惑的部分:

Shape rect = new RectShape(new Vector(0,0), new Vector(20,20));
Shape rect2 = new RectShape(new Vector(0,0), new Vector(20,20));
Shape line = new LineShape(new Vector(0,0), new Vector(20,20));

//Since I am saving shape and no specific shapetype, it will pass shape and pick the specific superFunction 
//Right now it calls the intersects(RectShape rectShape1, Shape shape) function due to calling it through the shape variable
rect.intersects(rect2); 
//This calls the intersects(LineShape lineShape, Shape shape) function
rect.intersects(line);    
//This calls the intersects(Shape shape1, Shape shape2) function
ShapeCollision.intersects(rect, line);
在不指定变量类型的情况下,如何实现调用带有子类参数的“correct”函数。(例如:(线形线形线形矩形)


我不想在这些函数中进行任何类型检查,也不想专门调用函数,但如果可能的话,可以使用一些设计模式或类似的东西:)

如果不在函数内部进行一些类型检查,或者在将形状实例传递给函数调用之前对其进行显式转换,则无法实现您想要的功能


当然,您可以用特定的类声明对象引用,但我想这并没有真正的帮助。

如果我没有错,Shape类实现了IShape和所有其他类LineSHape和RactShape扩展了Shape类。对吗?@GauravJeswani您是对的。你也可以对我应该使用什么样的班级结构提出建议。我只是好奇这是否可能。如果是这样的话,ShapeCollision.是如何相交的(这个,shape);正在编译?为了回答您的问题,我将调整代码,使所有内容都可见。我不知道你在问什么。我想你可能误解了什么;)是的,请更新代码。谢谢提供信息。也许有人会找到办法。但是从这个角度来看,你会以同样的方式设计架构吗?保存特定形状的问题是,我必须为每个形状创建一个游戏对象类。我考虑创建一个名为“LineObjects”的类,该类的对象由简单的线条和圆圈结构组成。在这种情况下,我只需要做这么多的类型检查。老实说,我并没有真正研究你的类的设计或逻辑,那将是一个完全不同的主题。当然,我对您要做的只是一个非常肤浅的理解,但是您可以尝试使用泛型参数并使用它们调用正确的函数。类似这样的东西:公共静态布尔相交(S1 shape1,S2 shape2){在这里,您执行所有类型检查以查看要调用哪个方法}通过这种方式,您可以将单个公共函数和所有其他insterspects方法设置为私有。增加了一些开销。我要补充的是,如果您想使这个方法成为静态的(就像您在ShapeCollision类中所做的那样),那么从和对象实例调用这个方法没有多大意义。您可以将其设置为Shape类的方法(静态或非静态)或ShapeCollision类的方法(我不想讨论哪个更好),我将尝试使用泛型。也许这会有帮助。仍然是一个有用的注释:)@Dreddy ce我从另一个类调用它,所以我必须做更少的类型检查,因为它是使用“right”第一个参数调用的,是子类。所以它用RectShape,Shape来代替Shape,Shape