注释
社区兴趣团体现已从 Yammer 迁移到Microsoft Viva Engage。 若要加入 Viva Engage 社区并参与最新讨论,请填写 “请求访问财务和运营 Viva Engage 社区 ”表单,然后选择要加入的社区。
本文介绍 X++ 中的继承,包括如何创建子类并重写方法。
创建子类
子类 是扩展或继承自其他类的类。 类只能扩展其他一个类。 不支持多个继承。 如果扩展类,子类将继承父类( 超级类)中的所有方法和变量。 使用子类可以重复使用现有代码,以实现更具体的用途。 因此,它们有助于在设计、开发和测试期间节省时间。 若要自定义超级类的行为,请重写子类中的方法。 超级类通常称为 基类,子类通常称为 派生类。
子类示例
以下示例首先创建一个名为 Point 的类。 然后,它会扩展 Point 类以创建名为 ThreePoint 的新类。
class Point
{
// Instance fields.
real x;
real y;
// Constructor to initialize fields x and y.
void new(real _x, real _y)
{
x = _x;
y = _y;
}
}
class ThreePoint extends Point
{
// Additional instance fields z. Fields x and y are inherited.
real z;
// Constructor is overridden to initialize z.
void new(real _x, real _y, real _z)
{
// Initialize the fields.
super(_x, _y);
z = _z;
}
}
防止类继承
可以使用 最终 修饰符防止类继承。
public final class Attribute
{
int objectField;
}
重写方法
类中的方法由扩展类的任何类继承。 若要更改继承方法的功能,请在子类中创建一个方法,然后为该方法提供与超类中方法相同的名称和参数。 此过程称为 重写 方法。
实例化子类时,可以向超级类类型的变量或子类类型分配引用。 无论变量的类型如何,都会调用重写的方法。
在下面的代码示例中,子类重写 写入 方法。 创建了两个变量,这两个 类型都为 Point 。 其中一个分配有 Point 对象,另一个被分配 有 ThreePoint 对象。 在 ThreePoint 对象上调用写入方法时,将调用该方法的 ThreePoint 版本。
class Point
{
// Instance fields.
real x;
real y;
// Constructor to initialize fields x and y.
void new(real _x, real _y)
{
x = _x;
y = _y;
}
void write()
{
info("(" + any2Str(x) + ", " + any2Str(y) + ")");
}
}
class ThreePoint extends Point
{
// Additional instance fields z. Fields x and y are inherited.
real z;
// Constructor is overridden to initialize z.
void new(real _x, real _y, real _z)
{
// Initialize the fields.
super(_x, _y);
z = _z;
}
void write()
{
info("(" + any2Str(x) + ", " + any2Str(y) + ", " + any2Str(z) + ")");
}
}
// Code that creates Point objects and calls the write method.
Point point2 = new Point(1.0, 2.0);
Point point3 = new ThreePoint(3.0, 4.0, 5.0);
point2.write();
// Output is "(1.0, 2.0)".
point3.write();
// Output is "(3.0, 4.0, 5.0)".
防止方法重写
无法重写静态方法,因为它们存在于每个类中。 若要保护其他敏感方法或核心方法不被重写,请使用 最终 修饰符。 在下面的示例中,由于 methodAtt 声明为 final,因此不能在扩展 Attribute 的任何类中重写该方法。 不应将 新的 或 最终方法 指定为 最终方法。
以下示例演示如何使用 最终 关键字。
public class Attribute
{
int objectVariable;
final void methodAtt()
{
//Some statements
}
}
重写与重载
当子类实现该方法更改方法的超类实现时,会发生重写,但两种方法的签名都是相同的。
相比之下,当多个方法具有相同名称时, 会发生重载 ,但方法具有不同的签名(返回类型、参数列表或两者)。 X++ 支持重写,但它不支持重载。