Перейти к содержимому

Base c что это

  • автор:

Что означает ключевое слово base при наследовании? [дубликат]

Это значит использовать конструктор базового класса(Account), и передать в него аргументы из конструктора текущего класса(DemandAccount).

27 авг 2018 в 9:52

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

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

Доступ к базовому классу разрешен только в конструкторе, методе экземпляра или методе доступа к свойству экземпляра. Использование ключевого слова base в статическом методе является недопустимым. Доступ осуществляется к базовому классу, заданному в объявлении класса. Например, если указать class ClassB : ClassA , члены ClassA будут доступны из ClassB независимо от базового класса ClassA .

public class BaseClass < int num; public BaseClass() < Console.WriteLine("in BaseClass()"); >public BaseClass(int i) < num = i; Console.WriteLine("in BaseClass(int i)"); >> public class DerivedClass : BaseClass < // Этот конструктор вызовет BaseClass.BaseClass() public DerivedClass() : base() <>// Этот конструктор вызовет BaseClass.BaseClass(int i) public DerivedClass(int i) : base(i) <> static void Main() < DerivedClass md = new DerivedClass(); //Вывод: in BaseClass() DerivedClass md1 = new DerivedClass(1); //Вывод: in BaseClass(int i) >> 

base (Справочник по C#)

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

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

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

Использование ключевого base слова из статического метода приведет к ошибке.

Доступ осуществляется к базовому классу, заданному в объявлении класса. Например, если указать class ClassB : ClassA , члены ClassA будут доступны из ClassB независимо от базового класса ClassA.

Пример 1

В этом примере как базовый, Person так и производный класс Employee имеют метод с именем GetInfo . С помощью ключевого base слова можно вызвать GetInfo метод базового класса из производного класса.

public class Person < protected string ssn = "444-55-6666"; protected string name = "John L. Malgraine"; public virtual void GetInfo() < Console.WriteLine("Name: ", name); Console.WriteLine("SSN: ", ssn); > > class Employee : Person < public string public override void GetInfo() < // Calling the base class GetInfo method: base.GetInfo(); Console.WriteLine("Employee ID: ", id); > > class TestClass < static void Main() < Employee E = new Employee(); E.GetInfo(); >> /* Output Name: John L. Malgraine SSN: 444-55-6666 Employee ID: ABC567EFG */ 

Дополнительные примеры см. в разделах new, virtual и override.

Пример 2

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

public class BaseClass < int num; public BaseClass() < Console.WriteLine("in BaseClass()"); >public BaseClass(int i) < num = i; Console.WriteLine("in BaseClass(int i)"); >public int GetNum() < return num; >> public class DerivedClass : BaseClass < // This constructor will call BaseClass.BaseClass() public DerivedClass() : base() < >// This constructor will call BaseClass.BaseClass(int i) public DerivedClass(int i) : base(i) < >static void Main() < DerivedClass md = new DerivedClass(); DerivedClass md1 = new DerivedClass(1); >> /* Output: in BaseClass() in BaseClass(int i) */ 

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

  • Справочник по C#
  • Руководство по программированию на C#
  • Ключевые слова в C#
  • this

Совместная работа с нами на GitHub

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

Что означает base в данном примере?

Author24 — интернет-сервис помощи студентам

Что означает %k в данном случае?
#include <iostream> #include <conio.h> using namespace std; void main() < int i,j,k;.

Что означает pos ^= 1 в данном коде?
#include <stdio.h> #include <stdlib.h> #define FILE_NAME "numbers.txt" int.

Что в данном случае означает friend?
Всем доброй ночи! Помню, кода-то очень давно мельком видел, что кто-то уже спрашивал аналогичный.

Что означает символ t в данном вариативном шаблоне?
Полный код: #include <iostream> template <typename T> struct NameOf <>; #define.

610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746

Лучший ответ

Сообщение было отмечено jongl как решение

Решение

base — имя переменной. Здесь определяется 3 переменных типа int: base, b, c. Переменная base получает начальное значение из некоторой переменной а (которая определена где-то выше по тексту), с инициализируется нулем. Про инициализацию b в таком контексте ничего не скажешь. Это может быть и нуль, и мусор (если локальный контекст).

Регистрация: 04.12.2020
Сообщений: 35

Хах, спасибо. Я так и думал, меня просто насторожило то, что в моём codeblocks base выделялся синим. Принял сначала как за обычную переменную, но потом начал мудрить и думать, что это какой то тип данных, или что ещё похуже.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере
Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере? struct.

Что означает знак тильда в данном примере?
Что означает знак тильда в данном примере? $s = "Один 1 два 2 и три 3"; if ($s =~.

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

Что означает this в данном контексте?
Привет дорогие киберфорумцы. Нашел код который меня поверг в замешательство. Вот от окаянный: .

Или воспользуйтесь поиском по форуму:

Объектно-ориентированное программирование

Наследование (inheritance) является одним из ключевых моментов ООП. Благодаря наследованию один класс может унаследовать функциональность другого класса.

Пусть у нас есть следующий класс Person, который описывает отдельного человека:

class Person < private string _name = ""; public string Name < get < return _name; >set < _name = value; >> public void Print() < Console.WriteLine(Name); >>

Но вдруг нам потребовался класс, описывающий сотрудника предприятия — класс Employee. Поскольку этот класс будет реализовывать тот же функционал, что и класс Person, так как сотрудник — это также и человек, то было бы рационально сделать класс Employee производным (или наследником, или подклассом) от класса Person, который, в свою очередь, называется базовым классом или родителем (или суперклассом):

class Employee : Person

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

Таким образом, наследование реализует отношение is-a (является), объект класса Employee также является объектом класса Person:

Person person = new Person < Name = "Tom" >; person.Print(); // Tom person = new Employee < Name = "Sam" >; person.Print(); // Sam

И поскольку объект Employee является также и объектом Person, то мы можем так определить переменную: Person p = new Employee() .

По умолчанию все классы наследуются от базового класса Object , даже если мы явным образом не устанавливаем наследование. Поэтому выше определенные классы Person и Employee кроме своих собственных методов, также будут иметь и методы класса Object: ToString(), Equals(), GetHashCode() и GetType().

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

  • Не поддерживается множественное наследование, класс может наследоваться только от одного класса.
  • При создании производного класса надо учитывать тип доступа к базовому классу — тип доступа к производному классу должен быть таким же, как и у базового класса, или более строгим. То есть, если базовый класс у нас имеет тип доступа internal , то производный класс может иметь тип доступа internal или private , но не public . Однако следует также учитывать, что если базовый и производный класс находятся в разных сборках (проектах), то в этом случае производый класс может наследовать только от класса, который имеет модификатор public.
  • Если класс объявлен с модификатором sealed , то от этого класса нельзя наследовать и создавать производные классы. Например, следующий класс не допускает создание наследников:

sealed class Admin

Доступ к членам базового класса из класса-наследника

Вернемся к нашим классам Person и Employee. Хотя Employee наследует весь функционал от класса Person, посмотрим, что будет в следующем случае:

class Employee : Person < public void PrintName() < Console.WriteLine(_name); >>

Этот код не сработает и выдаст ошибку, так как переменная _name объявлена с модификатором private и поэтому к ней доступ имеет только класс Person . Но зато в классе Person определено общедоступное свойство Name, которое мы можем использовать, поэтому следующий код у нас будет работать нормально:

class Employee : Person < public void PrintName() < Console.WriteLine(Name); >>

Таким образом, производный класс может иметь доступ только к тем членам базового класса, которые определены с модификаторами private protected (если базовый и производный класс находятся в одной сборке), public , internal (если базовый и производный класс находятся в одной сборке), protected и protected internal .

Ключевое слово base

Теперь добавим в наши классы конструкторы:

class Person < public string Name < get; set;>public Person(string name) < Name = name; >public void Print() < Console.WriteLine(Name); >> class Employee : Person < public string Company < get; set; >public Employee(string name, string company) : base(name) < Company = company; >>

Класс Person имеет конструктор, который устанавливает свойство Name. Поскольку класс Employee наследует и устанавливает то же свойство Name, то логично было бы не писать по сто раз код установки, а как-то вызвать соответствующий код класса Person. К тому же свойств, которые надо установить в конструкторе базового класса, и параметров может быть гораздо больше.

С помощью ключевого слова base мы можем обратиться к базовому классу. В нашем случае в конструкторе класса Employee нам надо установить имя и компанию. Но имя мы передаем на установку в конструктор базового класса, то есть в конструктор класса Person, с помощью выражения base(name) .

Person person = new Person("Bob"); person.Print(); // Bob Employee employee = new Employee("Tom", "Microsoft"); employee.Print(); // Tom

Конструкторы в производных классах

Конструкторы не передаются производному классу при наследовании. И если в базовом классе не определен конструктор по умолчанию без параметров, а только конструкторы с параметрами (как в случае с базовым классом Person), то в производном классе мы обязательно должны вызвать один из этих конструкторов через ключевое слово base. Например, из класса Employee уберем определение конструктора:

class Employee : Person < public string Company < get; set; >= ""; >

В данном случае мы получим ошибку, так как класс Employee не соответствует классу Person, а именно не вызывает конструктор базового класса. Даже если бы мы добавили какой-нибудь конструктор, который бы устанавливал все те же свойства, то мы все равно бы получили ошибку:

class Employee : Person < public string Company < get; set; >= ""; public Employee(string name, string company) // ! Ошибка < Name = name; Company = company; >>

То есть в классе Employee через ключевое слово base надо явным образом вызвать конструктор класса Person:

class Employee : Person < public string Company < get; set; >= ""; public Employee(string name, string company) : base(name) < Company = company; >>

Либо в качестве альтернативы мы могли бы определить в базовом классе конструктор без параметров:

class Person < public string Name < get; set; >// конструктор без параметров public Person() < Name = "Tom"; Console.WriteLine("Вызов конструктора без параметров"); >public Person(string name) < Name = name; >public void Print() < Console.WriteLine(Name); >>

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

public Employee(string company)

Фактически был бы эквивалентен следующему конструктору:

public Employee(string company) :base()

Порядок вызова конструкторов

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

class Person < string name; int age; public Person(string name) < this.name = name; Console.WriteLine("Person(string name)"); >public Person(string name, int age) : this(name) < this.age = age; Console.WriteLine("Person(string name, int age)"); >> class Employee : Person < string company; public Employee(string name, int age, string company) : base(name, age) < this.company = company; Console.WriteLine("Employee(string name, int age, string company)"); >>

При создании объекта Employee:

Employee tom = new Employee("Tom", 22, "Microsoft");

Мы получим следующий консольный вывод:

Person(string name) Person(string name, int age) Employee(string name, int age, string company)

В итоге мы получаем следующую цепь выполнений.

  1. Вначале вызывается конструктор Employee(string name, int age, string company) . Он делегирует выполнение конструктору Person(string name, int age)
  2. Вызывается конструктор Person(string name, int age) , который сам пока не выполняется и передает выполнение конструктору Person(string name)
  3. Вызывается конструктор Person(string name) , который передает выполнение конструктору класса System.Object, так как это базовый по умолчанию класс для Person.
  4. Выполняется конструктор System.Object.Object() , затем выполнение возвращается конструктору Person(string name)
  5. Выполняется тело конструктора Person(string name) , затем выполнение возвращается конструктору Person(string name, int age)
  6. Выполняется тело конструктора Person(string name, int age) , затем выполнение возвращается конструктору Employee(string name, int age, string company)
  7. Выполняется тело конструктора Employee(string name, int age, string company) . В итоге создается объект Employee

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *