gpt4 book ai didi

oop - OO 设计和镜像/复制方法

转载 作者:行者123 更新时间:2023-12-04 17:59:16 25 4
gpt4 key购买 nike

我在 OO 设计中遇到了一个问题,我最终在 2 个不同的类中得到了重复的代码。这是发生了什么:

在这个例子中,我想检测游戏对象之间的碰撞。

我有一个基本的 CollisionObject,它包含扩展基类的常用方法(例如 checkForCollisionWith)和 CollisionObjectBox、CollisionObjectCircle、CollisionObjectPolygon。

这部分设计看起来不错,但让我烦恼的是:打电话

aCircle checkForCollisionWith: aBox

将在 Circle 子类中执行圆与框碰撞检查。相反,
aBox checkForCollisionWith: aCircle

将在 Box 子类中执行 box vs circle 碰撞检查。

这里的问题是 Circle vs Box 碰撞代码是重复的,因为它在 Box 和 Circle 类中。有没有办法避免这种情况,或者我是否以错误的方式解决了这个问题?现在,我倾向于拥有一个包含所有重复代码的辅助类,并从 aCircle 和 aBox 对象调用它以避免重复。不过,我很好奇是否有更优雅的 OO 解决方案。

最佳答案

您想要的被称为multi dispatch .

Multiple dispatch or multimethods is the feature of some object-oriented programming languages in which a function or method can be dynamically dispatched based on the run time (dynamic) type of more than one of its arguments.



这可以在主线 OOP 语言中模拟,或者如果您使用 Common Lisp,则可以直接使用它。

维基百科文章中的 Java 示例甚至可以解决您的确切问题,即碰撞检测。

这是我们“现代”语言中的假货:
abstract class CollisionObject {
public abstract Collision CheckForCollisionWith(CollisionObject other);
}

class Box : CollisionObject {
public override Collision CheckForCollisionWith(CollisionObject other) {
if (other is Sphere) {
return Collision.BetweenBoxSphere(this, (Sphere)other);
}
}
}

class Sphere : CollisionObject {
public override Collision CheckForCollisionWith(CollisionObject other) {
if (other is Box) {
return Collision.BetweenBoxSphere((Box)other, this);
}
}
}

class Collision {
public static Collision BetweenBoxSphere(Box b, Sphere s) { ... }
}

这是在 Common Lisp 中的:
(defmethod check-for-collision-with ((x box) (y sphere))
(box-sphere-collision x y))

(defmethod check-for-collision-with ((x sphere) (y box))
(box-sphere-collision y x))

(defun box-sphere-collision (box sphere)
...)

关于oop - OO 设计和镜像/复制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1856113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com