Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается наследование в X++, включая создание подкласса и переопределение метода.
Создание подкласса
Подклассы — это классы , расширяющие или наследующие от других классов. Класс может расширить только один другой класс. Несколько наследование не поддерживается. При расширении класса подкласс наследует все методы и переменные в родительском классе ( суперкласс). Подклассы позволяют повторно использовать существующий код для более конкретной цели. Поэтому они помогают сэкономить время во время разработки, разработки и тестирования. Чтобы настроить поведение суперкласса, переопределите методы в подклассе. Суперкласс часто называется базовым классом, и подкласс часто называется производным классом.
Subclass example
В следующем примере сначала создается класс с именем 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 объявлен как окончательный, его нельзя переопределить в любом классе, расширяющем атрибут. Не указывайте новые или завершайте методыв качестве окончательных.
В следующем примере показано, как использовать окончательное ключевое слово.
public class Attribute
{
int objectVariable;
final void methodAtt()
{
//Some statements
}
}
Переопределение и перегрузка
Переопределение возникает, когда подкласс изменяет реализацию суперкласса метода, но оба метода имеют одинаковую сигнатуру.
В отличие от этого, перегрузка возникает, если несколько методов имеют одно и то же имя, но методы имеют разные сигнатуры (возвращаемые типы, списки параметров или оба). X++ поддерживает переопределение, но не поддерживает перегрузку.