Remontnouta.ru

ПК Ремонт техники
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Можно ли наследовать конструктор java

Наследование

Наследование является неотъемлемой частью Java. При использовании наследования вы говорите: Этот новый класс похож на тот старый класс. В коде это пишется как extends, после которого указываете имя базового класса. Тем самым вы получаете доступ ко всем полям и методам базового класса. Используя наследование, можно создать общий класс, которые определяет характеристики, общие для набора связанных элементов. Затем вы можете наследоваться от него и создать новый класс, который будет иметь свои уникальные характеристики. Главный наследуемый класс в Java называют суперклассом. Наследующий класс называют подклассом. Получается, что подкласс — это специализированная версия суперкласса, которая наследует все члены суперкласса и добавляет свои собственные уникальные элементы. К примеру, в Android есть класс View и подкласс TextView.

Чтобы наследовать класс, достаточно вставить имя наследуемого класса с использованием ключевого слова extends:

В этом коде мы наследуемся от класса Activity и добавляем свой код, который будет отвечать за наше приложение.

Подкласс в свою очередь может быть суперклассом другого подкласса. Так например, упоминавший ранее класс TextView является суперклассом для EditText.

В производный класс можно добавлять новые методы.

Для каждого создаваемого подкласса можно указывать только один суперкласс. При этом никакой класс не может быть собственным суперклассом.

Хотя подкласс включает в себя все члены своего суперкласса, он не может получить доступ к тем членам суперкласса, которые объявлены как private.

Помните, мы создавали класс Box для коробки кота. Давайте наследуемся от этого класса и создадим новый класс, который будет иметь не только размеры коробки, но и вес.

В том же файле Box.java после последней закрывающей скобки добавьте новый код:

Возвращаемся в главную активность и пишем код:

Обратите внимание, что мы вызываем метод getVolume(), который не прописывали в классе HeavyBox. Однако мы можем его использовать, так как мы наследовались от класса Box и нам доступны все открытые поля и методы. Заодно мы вычисляем вес коробки с помощью новой переменной, которую добавили в подкласс.

Теперь у нас появилась возможность складывать в коробку различные вещи. В хозяйстве всё пригодится.

При желании вы можете создать множество разных классов на основе одного суперкласса. Например, мы можем создать цветную коробку.

Вопросы о наследовании Java

Наследование является основной концепцией объектно-ориентированного программирования, такого как Java, с помощью которого мы можем наследовать свойства, такие как методы, атрибуты от одного класса к другому. Класс, производный от одного класса, называется подклассом, а класс, из которого получен подкласс, называется суперклассом. В любой момент подкласс может иметь только один суперкласс, тогда как суперкласс может иметь более одного подкласса. Подкласс может наследовать свойства как атрибуты, методы из суперкласса. Давайте рассмотрим пример транспортного средства, являющегося суперклассом, тогда как автомобиль, мотоцикл, грузовой автомобиль и т. Д. Являются подклассами, тогда как автомобиль, мотоцикл, грузовой автомобиль могут наследовать свойства транспортного средства, а наследование очень полезно при программировании и повторном использовании кода.

Существуют некоторые ограничения в наследовании, также как подкласс не может наследовать свойства от суперкласса, если они объявлены с частной областью действия и конструктором, инициализатор не может наследоваться подклассом, и каждый подкласс может иметь только один суперкласс. Java Inheritance — самая важная тема в объектно-ориентированном программировании и важная в вопросах интервью, связанных с программированием. Таким образом, мы будем кратко рассматривать вопросы интервью по наследству в разных аспектах и ​​контекстах.

Теперь, если вы ищете работу, связанную с Java Inheritance, вам нужно подготовиться к Вопросам по наследованию Java 2019. Это правда, что каждое собеседование отличается в зависимости от профилей работы. Здесь мы подготовили важные вопросы интервью по наследованию Java, которые помогут вам добиться успеха в вашем интервью.

В этой статье 2019 «Вопросы о наследовании Java» мы представим 10 наиболее важных и часто используемых вопросов об интервью о наследовании Java. Эти вопросы интервью делятся на две части:

Часть 1 — вопросы интервью о наследовании Java (базовый уровень)

В этой первой части рассматриваются основные вопросы и ответы об интервью по наследованию Java.

Q1 . В чем разница между наследованием и композицией в Java?

Ответ:
Java поддерживает как состав, так и наследование, но оба они различаются во многих отношениях. Композиционные объекты имеют ссылку на классы композиции, имея слабо ограниченную связь, и она имеет — имеет связь между классами. Используя это, мы можем использовать отдельные классы, которые могут быть скомпонованы в нескольких классах и использованы для внедрения зависимостей, а композиция — это связь между объектами, тогда как Наследование — это связь между классами, и она имеет отношение между классами, и использование наследуемого объекта класса объекта несет определение базового класса, следовательно, это тесно связанные отношения. Он в основном используется во время полиморфизма, и в этом случае один класс может наследовать только один класс.

Читайте так же:
Можно ли ставить желтые лампочки в габариты

Q2. Сколько типов наследования доступно в языке программирования Java?

Ответ:
В языке программирования Java существует пять типов наследования, как показано ниже:

Одиночное наследование, многоуровневое наследование, иерархическое наследование, гибридное наследование и множественное наследование.

  • Одиночное наследование: в этом одном классе наследуется или расширяется только один класс.
  • Гибридное наследование. Гибридное наследование представляет собой комбинацию одиночного, многоуровневого и иерархического наследования.
  • Многоуровневое наследование. В многоуровневом наследовании один класс расширяется одним классом, а этот расширенный класс или подкласс расширяется другим классом и образует цепочку отношений между классами, называемую многоуровневым наследованием.
  • Иерархическое наследование: в этом наследовании один класс расширяется более чем на один класс.
  • Множественное наследование. В этом наследовании один класс расширяет несколько классов, и он не поддерживается Java.

Давайте перейдем к следующим Вопросам интервью по наследованию Java.

Q3. Что такое супер ключевое слово в Java?

Ответ:
Ключевое слово super в Java является ссылочной переменной для непосредственного родительского объекта класса, т. Е. Всякий раз, когда создается экземпляр подкласса, экземпляр родительского класса создается неявно, что означает ссылку на ключевое слово super или переменную super reference. Ключевое слово super имеет разные цели и используется в качестве ключевого слова super, которое может использоваться для ссылки на непосредственную родительскую переменную класса, super () используется для ссылки на конструктор непосредственного родительского класса, а super используется для вызова метода непосредственного родительского класса.

Q4. В чем разница между наследованием и инкапсуляцией?

Ответ:
Это распространенные вопросы интервью о наследовании Java, задаваемые в интервью. Наследование — это связь между классами и объектно-ориентированной концепцией. Полезно реализовать ответственность кода при программировании. Мы можем использовать свойства базового класса, распространяясь на производный класс или подкласс, которые также имеют основу полиморфизма. Принимая во внимание, что Инкапсуляция также является объектно-ориентированной концепцией в Java, которая используется для сокрытия внутренних деталей класса, таких как методы, атрибуты. Он имеет только видимую декларацию, но не определение, как Hash-карта, инкапсулирующая, как хранить и вычислять значения хеш-функции.

Q5. Что такое перегрузка метода в Java?

Ответ:
Перегрузка метода в Java определяется как два метода, объявленные с одним и тем же именем, но с разными сигнатурами, например, один метод может принимать два параметра, тогда как другой метод может принимать только один параметр или три параметра и т. Д. Например, System.out.println является перегрузкой метод в Java, так как мы можем печатать различные типы данных, используя его, и перегрузка метода будет разрешена во время компиляции в Java.

Часть 2 — вопросы интервью о наследовании Java (продвинутый уровень)

Теперь давайте взглянем на расширенные вопросы и ответы по вопросам наследования Java.

Q6. Что такое метод Overriding в Java?

Ответ:
Переопределение метода в Java определено, поскольку будет два метода с одинаковыми именем и сигнатурой, но код или логика различны, и оба метода должны находиться в одном и том же подклассе. Он основан на полиморфизме во время выполнения, поскольку вызовы методов разрешаются во время выполнения в Java на основе фактического объекта.

Q7. Можно ли переопределить закрытый метод в Java?

Ответ:
Нет, мы не можем переопределить закрытый метод в Java, поскольку область действия закрытых методов ограничена только этим конкретным классом, и они не видны за пределами этого класса, поэтому они также не могут быть видны в производном классе или подклассе. Таким образом, частные методы не переопределяются.

Давайте перейдем к следующим Вопросам интервью по наследованию Java.

Q8. Правила переопределения метода в Java?

Ответ:
Правила переопределения метода в Java — метод переопределения, метод не может выдавать более высокое исключение, чем переопределенный метод, и это применимо или истинно для проверенных исключений, а метод переопределения не может изменить область действия переопределенного метода, т. Е. Если метод является общедоступным в базовом классе он также должен быть публичным в подклассе.

Q9. В Java возможно перегрузка конструктора?

Ответ:
Это самый популярный Java Inheritance Interview Вопросы, задаваемые в интервью. В Java переопределение конструктора невозможно, так как конструкторы не наследуются, поскольку переопределение всегда происходит в дочернем классе или подклассе, но имя конструктора совпадает с именем класса, поэтому переопределение конструктора невозможно, но возможна перегрузка конструктора.

В10. Может ли класс реализовать в Java более одного интерфейса, возможно ли это?

Ответ:
В Java, да, один класс может реализовывать более одного интерфейса. Класс может быть стерилизуемым и сопоставимым одновременно на Java. Это одна из причин того, что интерфейс в основном используется в программировании для этой цели, и мы можем использовать класс как полиморфную роль при программировании.

Читайте так же:
Мой личный кабинет ситилинк

Наконец, это заключение вопросов интервью Java Inheritance. Я надеюсь, что вы хорошо готовитесь к собеседованию, и эта статья «Вопросы о наследовании Java» поможет вам в дальнейшей подготовке к собеседованию. Я бы хотел, чтобы вы получили самые высокие оценки за подготовку к собеседованию и интервью.

Рекомендуемые статьи

Это было руководство к списку Вопросов Интервью Наследования Java, чтобы кандидат мог легко разобраться в этих Вопросах Интервью Наследования Java. Здесь, в этом посте, мы изучили лучшие вопросы интервью по наследованию Java, которые часто задают в интервью. Вы также можете посмотреть следующие статьи, чтобы узнать больше.

Супер ключевое слово

Супер ключевое слово похоже на это ключевое слово. Ниже приведены сценарии, в которых используется ключевое слово super.

Он используется для различения членов суперкласса от членов подкласса, если они имеют одинаковые имена.

Он используется для вызова конструктора суперкласса из подкласса.

Он используется для различения членов суперкласса от членов подкласса, если они имеют одинаковые имена.

Он используется для вызова конструктора суперкласса из подкласса.

Разграничение членов

Если класс наследует свойства другого класса. И если члены суперкласса имеют имена, совпадающие с подклассом, для дифференциации этих переменных мы используем ключевое слово super, как показано ниже.

Образец кода

В этом разделе представлена ​​программа, которая демонстрирует использование ключевого слова super .

В данной программе у вас есть два класса, а именно Sub_class и Super_class , оба имеют метод display () с разными реализациями и переменную с именем num с разными значениями. Мы вызываем метод display () обоих классов и печатаем значение переменной num обоих классов. Здесь вы можете заметить, что мы использовали ключевое слово super, чтобы отличать членов суперкласса от подкласса.

IS-A отношения

IS-A – это способ показать: этот объект является типом этого объекта. Давайте посмотрим, как ключевое слово extends используется для наследования.

Теперь, на основе приведенного выше примера, в объектно-ориентированных терминах верно следующее:

  • Животное – суперкласс класса млекопитающих.
  • Животное – суперкласс рептилий.
  • Млекопитающее и Рептилия являются подклассами класса животных.
  • Собака является подклассом классов млекопитающих и животных.

Теперь, если мы рассмотрим отношения IS-A, мы можем сказать –

  • Млекопитающее IS-A животное
  • Рептилия IS-A животное
  • Собака IS-A млекопитающее
  • Отсюда: собака тоже животное

С использованием ключевого слова extends подклассы смогут наследовать все свойства суперкласса, за исключением частных свойств суперкласса.

Мы можем гарантировать, что млекопитающее на самом деле является животным с использованием оператора экземпляра.

И результат
true
true
true

Покажем как ключевое слово Implements используется для получения отношения IS-A.

Обычно ключевое слово Implements используется с классами для наследования свойств интерфейса. Интерфейсы никогда не могут быть расширены классом.

Наследование классов и прототипов JavaScript ES2015 часть 1

После выхода окончательной версии спецификации ECMA Script 2015 ( ES2015 ) сообщество получило возможность двигаться в направлении ее реализации в движках JavaScript .

ES2015 предлагает для существующих функций множество новых полезных возможностей и более чистый синтаксис. Например, ключевое слово class , а также улучшенный синтаксис для JavaScript prototype .

До ES2015 реализация наследования прототипов с помощью JavaScript была запутанной. В традиционной модели классы наследуются от классов. Классы являются не более чем спецификацией или шаблоном, используемым для создания объектов.

Спецификации могут наследовать свойства других спецификаций. Используя унаследованные и собственные свойства, можно создавать новые объекты. В отличие от традиционного наследования, JavaScript не включает в себя поддержку этих спецификаций.

Что такое наследование прототипов JavaScript?

Наследование прототипов в JavaScript предполагает, что один объект наследуется от другого объекта, вместо того, чтобы одна спецификация наследовалась от другой. Даже ключевое слово нового класса является некорректным, потому что подразумевает спецификацию. Но на самом деле один объект наследуется от другого. Синтаксис в более ранних версиях JavaScript был слишком сложным, и ему трудно было следовать. Поэтому, как только разработчики принимают наследование от объекта к объекту, возникает вторая задача. Она состоит в том, чтобы улучшить синтаксис JavaScript prototype наследования — ввести классы ES2015 .

ES2015 классы в JavaScript

Данная спецификация обеспечивает более четкий синтаксис для определения структур классов, создания функций конструктора, расширения классов, вызова конструктора и функций в супер классе, а также предоставляет статические функции. Также ES2015 улучшает синтаксис для создания стиля ES5 получателя / установщика дескриптора свойств, что позволяет разработчикам использовать эти малоизвестные возможности спецификации.

Определения классов

JavaScript не содержит классов. Даже классы ES2015 это не совсем классы в традиционном смысле этого слова. А всего лишь « вычищенный » синтаксис для создания наследования прототипов между объектами. Но поскольку ES2015 использует термин « класс » для объектов, созданных с помощью функции конструктора ( функция-конструктор является конечным результатом ключевого слова class ), в этой статье мы будем использовать термин « класс «, чтобы описать не только классы ES2015 , но и ES5 .

Читайте так же:
Можно ли из микро сим сделать обычную

В версии ES5 и более ранних функции конструктора определяли « классы » следующим образом:

В ES2015 был введен новый синтаксис, с использованием ключевого слова class :

Нажмите здесь, чтобы загрузить код [typeof.js]

Функция конструктора осталась той же, что определена в ES5 . В обернутом блоке ключевого слова class определяются свойства для JavaScript function prototype . Синтаксис ключевого слова new для установки нового экземпляра класса остался неизменным.

С введением ключевого слова class появляется объект функции, который используется ES5 . Рассмотрим следующий выходной результат среды Node.js REPL . Во-первых, мы определяем новый класс, а затем оператор TypeOf перечисляет типы объекта класса:

В ES2015 роль и назначение функции конструктора не пересматривались, для нее просто был « вычищен » синтаксис.

Что такое конструкторы в JavaScript?

Конструктор — это функция, которая выполняется, когда используется оператор new для создания нового экземпляра класса. В функцию конструктора могут быть переданы аргументы для инициализации свойств объекта и выполнения других задач.

В ES5 функция конструктора выглядит следующим образом:

Аналог функции конструктора с синтаксисом ES2015 выглядит следующим образом:

Хотя новый синтаксис стал более объемным, но он является более четким и позволяет проще добавлять наследуемые свойства.

Чтобы установить объект с тем же синтаксисом, код должен быть тот же:

Нажмите здесь, чтобы загрузить код [constructors.js]

Расширение классов

До ES2015 большинство разработчиков не понимали, как реализовать наследования между объектами и использовать JavaScript prototype . Пообщавшись с разработчиками на C ++ , Java или C # , вы поймете, с какой легкостью они настраивают наследование одного класса от другого, а затем создают экземпляр объекта из подкласса. Попросите JavaScript разработчика продемонстрировать, как происходит наследование между двумя объектами, и в ответ вы увидите пустой взгляд.

Настройка наследования прототипов является непростым делом, а понятие наследования прототипа является неизвестным для большинства JavaScript разработчиков. Вот несколько примеров кода с комментариями, которые поясняют процесс настройки наследования:

Нажмите здесь, чтобы загрузить код [es5_inheritance.js]

Приведенный выше код трудно разобрать, и на то, чтобы установить наследование одного объекта от другого, поддерживая при этом функции конструктора, уходит много времени. Большинство JavaScript разработчиков не могут создать этот код по памяти, а многие вообще никогда не видели ничего подобного при работе с JavaScript .

Чтобы решить эту проблему, в новом синтаксисе структуры классов в ES2015 было введено ключевое слово extends . В следующем коде продемонстрировано то же наследование, что и в первом примере кода, но с использованием синтаксиса ES2015 для JavaScript object prototype :

Нажмите здесь, чтобы загрузить код [es6_inheritance.js]

Очевидно, что второй подход более прост для понимания. Оба кода воспроизводят одинаковую структуру объекта. Таким образом, новый синтаксис улучшает код наследования, но не меняет результат.

Другой способ изучить, как это работает — рассмотреть код наследования ES5 , сгенерированный TypeScript . TypeScript – это препроцессорный язык, который оптимизирует JavaScript через строгую типизацию и транспиллинг кода ES2015 в код ES5 . Транспилинг — это процесс компиляции исходного кода одного языка программирования в исходный код другого языка.

Функция _extends в JavaScript

Для поддержки наследования классов ES2015 TypeScript транспилирует функционал ключевого слова extends в функцию с именем __extends , которая запускает код, необходимый для настройки наследования. Вот код функции __extends :

Приведенный выше код немного труден, поэтому ниже приводится его расширенная, задокументированная версия. Чтобы понять назначение каждой строки кода, прочтите комментарии, добавленные в исходный код JavaScript prototype . Функция __extends работает с любой парой родительских и дочерних объектов:

Остальное содержимое блока — это реализация функции __extends . Она использует как шаблон примеси и JavaScript prototype наследование, чтобы построить взаимосвязь наследования между родительским и дочерним объектами. Шаблон примеси копирует свойства из одного объекта в другой. Приведенный ниже код обрабатывается через функцию __extends :

Следующие две строки кода сбивают с толку многих разработчиков:

Можно подумать, что вместо этого код должен быть составлен следующим образом:

Разработчики ошибочно полагают, что дочерний объект теперь будет наследоваться от объекта прототипа родительской функции конструктора. Но на самом деле объекты, созданные с помощью родительской функции конструктора, а также объекты, созданные с помощью дочерней функции конструктора, наследуются от точно такого же JavaScript object prototype . Это нежелательно, так как свойство прототипа дочерней функции конструктора не может быть изменено без одновременного изменения свойства прототипа родительской функции конструктора. Поэтому все изменения, внесенные в дочерний объект, будут также применены к родителю. Это некорректное наследование:

Читайте так же:
Госуслуги личный кабинет ооо

Функция _extends в JavaScript

При создании нового экземпляра объекта с помощью оператора new и родительской или дочерней функции конструктора, полученные объекты будут наследоваться от того же объекта-прототипа ( РРО ). Установленные родительские и дочерние объекты являются объектами одного уровня с РРО в качестве родителя. Дочерний объект не наследуется от родителя.

Таким образом, целью данного кода является установить следующую структуру наследования:

Функция _extends в JavaScript - 2

С помощью этой новой структуры новые дочерние объекты наследуются от CPO ( объект прототипа потомков ), который наследуется от РРО . Новые свойства могут быть добавлены в CPO , который не влияет на РРО . Новые родительские объекты наследуются от РРО , и не зависят от изменений в СРО . Изменения в РРО будут унаследованы объектом, созданным как с помощью родительской, так и с помощью дочерней функций конструктора. С помощью этой новой структуры дочерние объекты наследуются от родителя.

И в конце закрывающая фигурная скобка относится к изначальному блоку if :

Нажмите здесь, чтобы загрузить код [ts_extends.js]

Синтаксис ES2015 для расширения классов гораздо более прост для понимания JavaScript prototype . Он содержит два новых ключевых слов: extends и super . Ключевое слово extends устанавливает отношения наследования прототипа между родительскими и дочерними классами. Ключевое слово super вызывает конструктор для класса родителя ( он же суперкласс ). Вызов функции super требуется, даже если родительский объект не содержит конфигурацию.

Вызов супер конструктора это то, что создало этот новый объект, который будет использоваться в дочернем классе ( он же подкласс ):

Нажмите здесь, чтобы загрузить код [extends.js]

Объекты JavaScript позволяют только одиночное наследование, и не имеют встроенной поддержки интерфейсов ( TypeScript предоставляет интерфейсы ).

Классы ES2015 значительно улучшают синтаксис для определения свойств наследования объектов, свойств получателя / установщика. Хотя классы ES2015 не меняют характер наследования прототипа, они делает JavaScript prototype более доступным для JavaScript разработчиков.

Дайте знать, что вы думаете по данной теме материала в комментариях. Мы очень благодарим вас за ваши комментарии, подписки, лайки, отклики, дизлайки!

Подъём тела конструктора

Подклассы имеют конструкторы с преимущественно одинаковым кодом.

Решение

Создайте конструктор в суперклассе и вынесите в него общий для подклассов код. Вызывайте конструктор суперкласса в конструкторах подкласса.

Причины рефакторинга

Чем этот рефакторинг отличается от подъёма метода?

В Java подклассы не могут наследовать конструктор, поэтому вы не можете просто применить подъём метода к конструктору подкласса и удалить его после перемещения всего кода конструктора в суперкласс. Вдобавок к созданию конструктора в суперклассе нужно будет иметь конструкторы в подклассах с простым делегированием к конструктору суперкласса.

В C++ и Java (в случае, если вы явно не вызвали конструктор суперкласса) конструктор суперкласса автоматически вызывается перед конструктором подкласса, что делает обязательным перемещение общего кода только из начала конструкторов подклассов (так как вы не сможете вызвать конструктор суперкласса в произвольном месте конструктора подкласса).

В большинстве языков программирования конструктор подкласса может иметь свой собственный список параметров, отличный от параметров суперкласса, поэтому вы должны создать конструктор суперкласса только с теми параметрами, которые ему действительно нужны.

Порядок рефакторинга

Создайте конструктор в суперклассе.

Извлеките общий код из начала конструктора каждого из подклассов в конструктор суперкласса. Перед этим действием стоит попробовать поместить как можно больше общего кода в начало конструктора.

Поместите вызов конструктора суперкласса первой строкой в конструкторах подклассов.

Устали читать?

Сбегайте за подушкой, у нас тут контента на 7 часов чтения.

Или попробуйте наш интерактивный курс. Он гораздо более интересный, чем банальный текст.

Скидки!

Этот рефакторинг — малая часть интерактивного онлайн курса по рефакторингу.

C#. Наследование. Использование конструкторов в классах при наследовании. Ключевое слово base. Примеры

Содержание

  • 1. Порядок вызова конструкторов классов, которые образовывают иерархию
  • 2. Ключевое слово base . Необходимость применения. Общая форма
  • 3. Вызов конструктора базового класса с использованием средства base . Общая форма. Примеры
    • 3.1. Пример вызова конструктора базового класса с помощью ключевого слова base . Используется иерархия из трех классов
    • 3.2. Вызов конструктора базового класса с помощью base . Пример классов Human => Worker

    Поиск на других ресурсах:

    1. Порядок вызова конструкторов классов, которые образовывают иерархию

    При создании экземпляра (объекта) класса первым вызывается конструктор этого класса. Если класс B есть производным от базового класса A , то сначала вызывается конструктор базового класса A , а затем конструктор производного класса B . Если классы образовывают иерархию из нескольких уровней наследования, то сначала будут вызываться конструкторы классов высших уровней в виде цепочки вплоть до вызова конструкторов более низких уровней.

    На рисунке 1 изображена последовательность вызова конструкторов в случае наследования трех классов с именами A , B , C . Как видно из рисунка, первым всегда вызывается конструктор базового класса A . Вторым всегда вызывается конструктор класса B , который размещается на среднем уровне иерархии. Последним будет вызван конструктор класса C , который находится на нижнем уровне иерархии.

    C#. Порядок вызова конструкторов в случае наследования трех классов

    Рисунок 1. Демонстрация порядка вызова конструкторов в случае наследования трех классов

    Приведенный на рисунке 1 порядок вызова конструкторов есть логически правильным. Это связано с тем, что производные классы имеют более специализированный характер, чем базовый класс. Специализированная часть предусматривает, что она накладывается поверх общей. Таким образом, конструктор производного класса имеет возможность использовать унаследованные качества конструктора базового класса.

    2. Ключевое слово base . Необходимость применения. Общая форма

    Если классы образовывают иерархию, то в производном классе возникает необходимость обратиться к элементу базового класса. В языке C# для таких случаев предусмотрено использование ключевого слова base. Если в базовом классе есть скрытые элементы (объявленные как private ), то к этим элементам нет доступа с помощью ключевого слова base .

    Общая форма использования ключевого слова base в методе производного класса, следующая:

    • class_element – элемент базового класса, который не является скрытым (перед которым не стоит модификатор доступа private ). Элементом базового класса может быть конструктор, метод (функция), свойство, поле данных. Для любого из этих элементов предусмотрен отдельный синтаксис использования (смотрите пункты ниже).
    3. Вызов конструктора базового класса с использованием средства base . Общая форма. Примеры

    Конструктор базового класса может быть вызван явным образом из конструктора производного класса. Для этого, при объявлении конструктора производного класса, нужно использовать ключевое слово base . Общая форма такого объявления следующая:

    • ClassName – имя конструктора производного класса;
    • parameters1 – параметры конструктора базового класса. Чтобы компилятор не выдавал ошибки, в базовом классе должен быть явно объявлен конструктор с точно такими же параметрами;
    • parameters2 – параметры конструктора производного класса.

    первым вызовется конструктор базового класса с помощью вызова

    затем вызывается тело конструктора ClassName() .

    3.1. Пример вызова конструктора базового класса с помощью ключевого слова base . Используется иерархия из трех классов

    Пример демонстрирует наследование трех классов A , B , C . Класс A есть базовым для класса B . В свою очередь, класс B есть базовым для класса C .

    Как видно из вышеприведенного кода, В классе из конструктора класса B вызывется конструктор класса A с помощью строки

    Аналогично в классе C из конструктора C(int) вызывается конструктор класса B

    Результат работы программы

    3.2. Вызов конструктора базового класса с помощью base . Пример классов Human=>Worker

    Задан базовый класс Human (Человек). В классе заданы следующие элементы:

    • внутреннее поле name , реализующее фамилию и имя человека;
    • конструктор с 1 параметром Human(string) ;
    • свойство Name . Используется для доступа к внутреннему полю name .

    Из класса Human наследуется класс Worker (Рабочий). В классе Worker реализованы следующие элементы:

    • внутреннее поле – дата принятия на работу date в формате строки;
    • внутреннее поле – должность position ;
    • конструктор с тремя параметрами Worker(string, string, string) , устанавливающий внутренние поля производного класса Worker и базового класса Human . Для вызова конструктора базового класса используется ключевое слово base ;
    • свойство Date для доступа к внутреннему полю date ;
    • свойство Position для доступа к внутреннему полю position.

    Текст программы, созданной по шаблону Console Application следующий:

    Результат работы программы

    4. В каких случаях не обязательно использовать ключевое слово base для вызова конструктора базового класса? Пример

    Для того, чтобы в конструкторе производного класса не использовать ключевое слово base , нужно в базовом классе реализовать конструктор без параметров. Тогда этот конструктор будет вызываться неявно из всех конструкторов производного класса. При этом, и базовый и производный классы могут содержать разные реализации конструкторов.

    Пример. Даны два класса с именами A , B . В классе A объявлены 2 конструктора:

    • без параметров A() ;
    • с параметром A(int) .

    Класс B есть производный от класса A . В классе B , при объявлении конструктора (любого ) не обязательно использовать ключевое слово base , так как в классе A объявлен конструктор без параметров.

    Если в классе A() убрать объявление конструктора без параметров

    то компилятор выдаст ошибку

    5. Пример явного вызова конструктора базового класса с помощью ключевого слова base без указания параметров

    Если в базовом классе A объявлен конструктор без параметров A() , то допускается указание ключевого слова base без параметров.

    Например.

    6. Неявный вызов конструкторов базовых классов на примере иерархии из трех классов.

    Пример демонстрирует иерархию вызовов конструкторов без ключевого слова base для классов A , B , C . Ключевое слово base используется неявно.

    голоса
    Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector