继承和多态
继承
在 DolphinDB 脚本中,虽然只支持单继承模式,即一个类仅能从一个父类继承,但得益于其动态语言的特性和鸭子类型(duck typing)的概念,对象的类型由其行为决定,而非其继承关系。这意味着,即使没有多继承,一个类也能模拟多个类的特性,只要它实现了所需的方法和属性。
用法
在 DolphinDB
脚本中,类的继承允许派生类继承基类的属性和方法。但是,需要特别注意的是,派生类中的属性名必须是唯一的,不能与基类中的属性名重复。
class Base {
alpha :: INT
def Base(a) {
alpha = a
}
def method() {
print(alpha)
}
}
class Derived : Base {
beta :: INT
// 派生类中的属性名不能和基类中的重复,会出现报错
// alpha :: INT
def Derived(a, b) {
alpha = a
beta = b
}
def method2() {
method()
// 可以使用基类中的属性
print(alpha + beta)
}
}
x = Derived(1,2)
x.method2()
//output: 1 3
在派生类中可以调用基类的构造函数。
class Base {
alpha :: INT
def Base(a) {
alpha = a
}
def method() {
print(alpha)
}
}
class Derived : Base {
beta :: INT
def Derived(a, b) {
Base(a)
beta = b
}
def method2() {
method()
}
}
x = Derived(1,2)
x.method2()
//output: 1
多态
在类的定义中,方法的行为类似于 C++
中的虚函数,它们支持多态性。当派生类中出现与基类同名的方法时,派生类的方法将覆盖基类的方法。为了实现正确的方法覆盖(重写),派生类的方法必须与基类的方法具有相同的函数签名(参数列表和返回类型)是相同的。
class Base {
def Base() {}
def virtualMethod() {}
def doSomething() {
virtualMethod()
}
}
class Derived : Base {
alpha :: INT
def Derived(a) {
alpha = a
}
// override
def virtualMethod() {
print(alpha)
}
}
d = Derived(100)
d.doSomething()
// output: 100