Source: 2.3.2 Inheritance
Как во многих объектно-ориентированных языках, классы в языке Haxe являются основной структурой данных для большинства программ. Класс объявляется с помощью ключевого слова
class . В классе может быть ноль или более полей класса. Пример класса
Ogr, который представляет собой создание экземпляра класса
Ogr, с полем
life типа
Int:
1 2 3 4 5 6 7 8 9 |
class Ogr { var life : Int; public function new(life) { this.life = life; } public function toString() { return "Ogr("+life+")"; } } |
Экземпляр класса создается с помощью ключевого слова new:
1 2 |
var ogr = new Ogr(50); trace(ogr.toString()); |
Здесь метод toString() отображает представление экземпляра класса Ogr.
В Haxe классы могут наследовать от других классов, это осуществляется с помощью использования ключевого слова extends:
1 2 3 4 5 6 7 8 9 10 |
class Warrior extends Ogr { var skill : Int; public function new(life,skill) { super(life); this.skill = skill; } public override function toString() { return "Warrior("+life+","+skill+")"; } } |
Так любой экземпляр класса Warrior также является экземпляром класса Ogr. В этом случае Ogr называется родительским классом для класса Warrior, а Warrior является дочерним классом для класса Ogr. У одного родительского класса может быть много дочерних классов, но у дочернего есть только один родительский класс. Определение «родительский класс класса X» обычно относится к его прямому родительскому классу, родительскому классу его родительского класса и т. д.
Вышеприведенный код класса Warrior очень похож на исходный код родительского класса Ogr, но в нем появляются две новые конструкции:
-
extends Ogr обозначает, что этот класс наследует класс
Ogr
- super (x, y) — вызывает конструктор родительского класса, в данном случае Ogr.new
- override переопределяет метод toString() родительского класса Ogr
Для дочерних классов не обязательно определять собственные конструкторы, но если они есть, вызов super () является обязательным. В отличие от некоторых других объектно-ориентированных языков, этот вызов может появляться в любом месте кода конструктора и не обязательно должен быть первым выражением.
Создается экземпляр класса Warrior таким образом:
1 2 |
var ogrw:Ogr = new Warrior(45,3); trace(ogrw.toString()); |
Где видно, что когда класс наследует другой класс он становится подтипом родительского класса, т.е. каждый экземпляр Warrior также является и экземпляром типа Ogr.
Подробнее про эффекты и ограничения переопределяющих методов можно прочитать в Overriding Methodsе.
- e-olymp 107. Компакт-диски - 23.06.2017
- e-olymp 128. Счастливые билеты - 22.06.2017
- e-olimp 248. Юный садовод - 22.06.2017
— Сделайте постоянную ссылку просто по номеру раздела (т.е. 2.3.2).
— «Подобно языкам классы являются» — что-то Вы не то хотели сказать.
— Где примеры Вашего кода?
— Объясните про «неявный путь».
— «и в нем появляются». Не «и», а «но» или «однако».
— Сделайте ссылки на страницы этого сайта о «переопределяющих методах».
Спасибо. Исправила
Зачтено, но…
Для вставки фрагментов кода в строку Вы используете span style=»color: #ffffff» и code. Лучше использовать возможности crayone установив галочку в поле inline. Это позволит сделать подсветку синтаксиса одинаковой в тексте и коде. Для примера я исправил это при первом упоминании кода (слово class).
Спасибо. Изменила