当前位置: 首页 > 知识库问答 >
问题:

什么时候动态多态是必要的(与静态多态相比)?

云远
2023-03-14
  • 当我们使用有对象的子类型系统时,我们不能决定它的实际类型(例如,我们有一个包含许多不同类型对象的容器。但是,在这种情况下,为什么不尝试代数数据类型或联合类型来建模容器的元素类型呢?)。
  • 我们只有对象,我们不知道它的方法的真实名称,所以我们必须使用vptr表来帮助我们。

共有1个答案

干浩阔
2023-03-14

在Haskell中,我们用高阶函数代替“动态多态性”。

考虑以下问题:我们希望定义一个表示谓词的类型。我们最终将在实现列表时使用此类型谓词,以便定义过滤器函数。我们希望能够轻松地定义相等谓词,即小于谓词,并且能够通过用“and”连接两个谓词来组合它们。

合理的Java尝试如下所示。

interface Predicate<T> {
    public abstract boolean predicate(T x);
}

class EqualsPredicate<T> implements Predicate<T> {
    private final T value;

    public EqualsPredicate(T value) {
        this.value = value;
    }

    @Override
    public boolean predicate(T x) {
        return this.value.equals(x);
    }
}

class LessPredicate<T implements Comparable<T>> implements Predicate<T>{
    private final T value;

    public LessPredicate(T value) {
        this.value = value;
    }

    @Override
    public boolean predicate(T x) {
        return this.value.compareTo(x) < 0;
    }
}

class AndPredicate<T> implements Predicate<T> {
    private final Predicate<T> p1;
    private final Predicate<T> p2;

    public AndPredicate(Predicate<T> p1, Predicate<T> p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    @Override
    public boolean predicate(T x) {
        return p1.predicate(x) && p2.predicate(x);
    }
}
type Predicate t = t -> Bool

makeEqualsPredicate :: Eq t => t -> Predicate t
makeEqualsPredicate = (==)

makeLessPredicate :: Ord t => t -> Predicate t
makeLessPredicate = (<)

makeAndPredicate :: Predicate t -> Predicate t -> Predicate t
makeAndPredicate p1 p2 x = p1 x && p2 x
-- or, even more succinctly, makeAndPredicate = liftA2 (&&)

但是等等,你说。谓词是一个只有一个方法的接口。如果我们想有两种方法,我们应该怎么做?

如果有一个方法的接口对应一个函数,那么有两个方法的接口必须对应一对函数。这就是所谓的“组合重于继承”的OOP原则。

所以我们总是可以用Haskell风格的高阶函数代替Java风格的动态多态性。

@FunctionalInterface
interface Predicate<T> {
    public abstract boolean predicate(T x);

    public static Predicate<J> makeEqualsPredicate(J t) {
        return (x) -> t.equals(x);
    }

    public static Predicate<J implements Comparable<J>> makeLessPredicate(J t) {
        return (x) -> t.compareTo(x) < 0;
    }

    public Predicate<T> makeAndPredicate(Predicate<T> other) {
        return (x) -> this.predicate(x) && other.predicate(x);
    }
}
 类似资料:
  • 本文向大家介绍静态和动态多态性有什么区别?,包括了静态和动态多态性有什么区别?的使用技巧和注意事项,需要的朋友参考一下 多态是对象采取多种形式的能力。当使用父类引用来引用子类对象时,会在OOP中最常见地使用多态。被子类覆盖的方法称为运行时多态。JVM确定要在运行时而不是编译时执行的方法。在参数不同的同一类中,方法重载是静态多态的一个示例,编译器在编译时就知道要执行哪种方法。

  • 有人能提供一个简单的例子来解释Java中动态多态性和静态多态性之间的区别吗?

  • 我理解了使用奇怪的重复模板模式的静态多态性的机制。我只是不明白这有什么好处。 公开的动机是: 更喜欢使虚函数私有。 当然,还有一个彻底的解释,为什么这是好的风格。 在本指南的上下文中,第一个示例是好的,因为: 关于静态多态性,我遗漏了什么?这一切都是关于好的C++风格吗? 应该什么时候使用?有哪些指导方针?

  • 问题内容: 谁能提供一个简单的示例来说明Java中动态和静态多态性之间的区别? 问题答案: 多态性 1.静态绑定/编译时绑定/早期绑定/方法重载。(在同一类中) 2.动态绑定/运行时绑定/后期绑定/方法重写(在不同的类中) 重载示例: 首要示例:

  • 问题内容: 在我的数据库的多个地方,开发人员使用了动态sql而不是静态sql。他们说这是为了提高性能。有人可以告诉我动态sql是否真的可以提高存储过程或plsql块的性能吗? 哪个执行速度更快,为什么? 1。 2。 问题答案: 您的示例代码非常简单,几乎没有什么区别,但是在那种情况下,静态版本最有可能执行得更好。 使用动态SQL来提高性能的主要原因是,当SQL语句发生重大变化时- 例如,您可以根据

  • 我在比较C++多态性的以下方法的性能: 方法[1]。使用boost变体的静态多态性,每个方法都有一个单独的访问者method[2]。静态多态性使用boost变体,单个访问者调用不同的方法,使用方法重载方法[3]。平原老动态多态性 一些发现: 方法[1]似乎明显优于方法[2]和[3] 方法[3]在大多数情况下都优于方法[2] 我的问题是,为什么方法[2]在我使用一个访问者但使用方法重载来调用正确的方