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 при наследовании? [дубликат]
Это значит использовать конструктор базового класса(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) >>
c-base
![]()
550 хакер

c-база e. V. — некоммерческая ассоциация, расположенная в Берлине , Германия. Его цель — повысить уровень знаний и навыков, касающихся программного обеспечения, оборудования и сетей передачи данных. Ассоциация занимается многими смежными видами деятельности. Например, у компании были стенды на крупных фестивалях, таких как День защиты детей, где они знакомили молодых людей с такими темами, как робототехника и компьютерный дизайн.
Головной офис ассоциации, c-base, также используется другими инициативами в Берлине и его окрестностях в качестве места проведения мероприятий или как приемная или конференц-зал для различных общественных сетей, таких как freifunk.net, Chaos Computer Club и Берлинская группа Википедии. назвать несколько. Любая группа с общими ценностями в c-base также приветствуется и может использовать помещения для встреч или мероприятий. Всем гостям предоставляется бесплатный беспроводной доступ в Интернет.
Резюме
- 1 Ассоциация
- 1.1 Валюта ассоциации
- 4.1 Структура c-base
Ассоциация
C-base — это некоммерческая ассоциация, которую поддерживают как платящие члены, так и доноры. Целью этой ассоциации является обучение в области аппаратного обеспечения, программного обеспечения и сетей, что достигается посредством частых конференций, семинаров и культурных мероприятий, посвященных этим предметам. Участие в этих различных мероприятиях, как правило, разрешено лицам, не являющимся членами.
Валюта ассоциации
Девиз c-base: «Будьте совместимы с будущим!» »И призывает своих членов направить свои мысли и действия в пользу будущего, построенного на позитивном и конструктивном мышлении.
История
Семнадцать человек основали c-base e. V. осенью 1995 года. В течение 2002 и 2003 годов был запущен проект BerlinBackBone для обеспечения и продвижения бесплатного общественного доступа к Интернету через общественные беспроводные сети. Параллельно с этим в 2003 году ассоциация c-base начала организовывать еженедельные встречи музыкантов под названием Cosmic Open Stage, обеспечивая тем самым платформу для известных и неизвестных музыкантов, желающих организовать джем-сейшны или концерты. c-base признан одним из первых хакерских пространств в мире. c-base и Metalab напрямую повлияли на создание хакерских пространств в США.
Деятельность
Помимо основной цели ассоциации c-base, ее члены также участвуют во многих других мероприятиях, например, «Go and Jugger», правила которой фиксируются файлами на c-луче, главном компьютере в c-base. Кроме того, @ c-terra проводится один раз в год, мероприятие, организованное ассоциацией c-base, дает обзор всех предлагаемых мероприятий.
В помещениях ассоциации c-base проходит большое количество различных мероприятий (вечеринок, презентаций, театральных постановок, концертов и художественных выставок). Компания c-base также присутствует на мероприятиях Chaos Computer Club, таких как Chaos Communication Congress или Chaos Communication Camp.
Мифы о c-base
О местонахождении C-Base осталось много мифов. Этот миф гласит, что под центром Берлина есть остатки космической станции под названием c-base. Антенна космической станции будет представлять собой берлинскую Fernsehturm , большой шпиль с зеркальным шаром наверху и характерный ориентир, видимый через весь город.
Структура c-base
Структура c-основы представляет собой систему из семи концентрических колец, которые могут перемещаться относительно друг друга. Каждое кольцо рассматривается как единый модуль со специальным набором функций. Кольца называются «центр», «ком», «культура», «креатив», «наука», «карбон» и «зажим». Внутреннее кольцо, сердечник, обеспечивает питание от генератора ленты Мебиуса. Центральный компьютер c-base, «c-образная балка», расположен в центре станции. На втором кольце, com, находятся космические порты, ангары и устройства связи, включая модуль межзвездной связи, недавно идентифицированный компьютерным клубом Хаоса как Blinkenlights. Следующие три кольца — культура, творчество и наука — служат хостом для устройств, служащих культуре, творчеству и науке. Последнее кольцо также является местом расположения Дендрария. Жилье для экипажа станции расположено на «карбоновом» кольце. Наружное кольцо, зажимы, стабилизирует станцию.
Любопытства
- В 10 сентября 2006 г. , Немецкая пиратская партия была торжественно открыта на базе c-base
- На c-base были сняты эпизоды 430, Tödliches Labyrinth и 691, Tod einer Heuschrecke из немецкого телесериала Tatort .
- Местное отделение Википедии регулярно встречается на базе c-base с 2004 года.
Внешние ссылки
- Как Берлин стал хакерской столицей
- Официальная пресса (PDF-Datei; 472 kB)
- Маркус Тёнисс, Die Welt: Das Schiff der Träume unter Berlin (22 марта 2001 г.)
- Рагни-Серина Злотос, Spiegel-Online: Ein Flugzeug voller Hacker (10 августа 2007 г.)
- Марк Бенеке на YouTube Backstage на базе (16 декабря 2008 г.)
- Ник Фарр Убер Hackerspaces и c-base на YouTube — « https://www.youtube.com/watch?v=RPA69UZ62X0 » ( архив • Wikiwix • Archive.is • Google • Что делать? ) , Английский (29 декабря, 2008 г.)
- Питер Шнайдер / Nokia über c-base на YouTube — « https://www.youtube.com/watch?v=pR95TYHDJFE » ( Архив • Wikiwix • Archive.is • Google • Что делать? ) , Английский (13 октября, 2008 г.)
Объектно-ориентированное программирование
Наследование (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)
В итоге мы получаем следующую цепь выполнений.
- Вначале вызывается конструктор Employee(string name, int age, string company) . Он делегирует выполнение конструктору Person(string name, int age)
- Вызывается конструктор Person(string name, int age) , который сам пока не выполняется и передает выполнение конструктору Person(string name)
- Вызывается конструктор Person(string name) , который передает выполнение конструктору класса System.Object, так как это базовый по умолчанию класс для Person.
- Выполняется конструктор System.Object.Object() , затем выполнение возвращается конструктору Person(string name)
- Выполняется тело конструктора Person(string name) , затем выполнение возвращается конструктору Person(string name, int age)
- Выполняется тело конструктора Person(string name, int age) , затем выполнение возвращается конструктору Employee(string name, int age, string company)
- Выполняется тело конструктора Employee(string name, int age, string company) . В итоге создается объект Employee