Главная страница

1. Наследуется ли конструктор базового класса


Скачать 39.64 Kb.
Название1. Наследуется ли конструктор базового класса
Дата08.03.2018
Размер39.64 Kb.
Формат файлаdocx
Имя файлаoop.docx
ТипДокументы
#37950

1.Наследуется ли конструктор базового класса

Как минимум в Java в любом конструкторе (кроме оного в классе Object) первое что происходит - это вызов конструктора родителя. Либо явно (с помощью super()), либо неявно (но в таком случае у родителя обязательно должен быть конструктор без параметров).

class HeavyBox extends Box {

int weight; // вес коробки

// конструктор

// инициализируем переменные с помощью ключевого слова super

HeavyBox(int w, int h, int d, int m) {

super(w, h, d); // вызов конструктора суперкласса

weight = m; // масса

}}

В Java существует ключевое слово super, которое обозначает суперкласс, т.е. класс, производным от которого является текущий класс. Посмотрим, зачем это нужно.

В конструкторе HeavyBox мы дублировали поля width,height и depth, которые уже есть в классе Box. Это не слишком эффективно. Кроме того, возможны ситуации, когда суперкласс имеет закрытые члены данных, но мы хотим иметь к ним доступ. Через наследование это не получится, так как закрытые члены класса доступны только родному классу. В таких случаях вы можете сослаться на суперкласс.

Ключевое слово super можно использовать для вызова конструктора суперкласса и для обращения к члену суперкласса, скрытому членом подкласса.

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

При вызове метода super() с нужными аргументами, мы фактически вызываем конструктор Box, который инициализирует переменные width, height и depth, используя переданные ему значения соответствующих параметров. Вам остаётся инициализировать только своё добавленное значение weight. При необходимости вы можете сделать теперь переменные класса Box закрытыми. Проставьте у полей класса Box модификатор private и убедитесь, что вы можете обращаться к ним без проблем.

У суперкласса могут быть несколько перегруженных версий конструкторов, поэтому можно вызывать метод super() с разными параметрами. Программа выполнит тот конструктор, который соответствует указанным аргументам.

2. Почему композицию лучше использовать вместо наследований?

Преимущества композиции перед наследованием: 1. Нет конфликта имён, возможного при наследовании. 2. Возможность смены агрегируемого объекта в runtime. 3. Полная замена агрегируемого объекта в классах, производных от класса, включающего агрегируемый объект.

Если рассматривать, например, C#, не поддерживающий множественное наследование, но позволяющий наследовать от множества интерфейсов и создавать методы расширения для этих интерфейсов, то можно выделить ещё два плюса (речь в данном случае может идти только о поведениях (алгоритмах) в рамках паттерна «Стратегия»): 4. Агрегируемое поведение (алгоритм) может включать в себя другие объекты. Что в частности позволяет переиспользовать посредством агрегации другое поведение. 5. При агрегации есть возможность скрыть определённую часть реализации, а также исходные параметры, необходимые поведению, посредством передачи их через конструктор (при наследовании поведению придётся запрашивать их через методы/свойства собственного интерфейса).

Минусы:

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

2. Агрегация (и это, пожалуй, главный нюанс) отличается от наследования в первую очередь тем, что агрегируемый объект не является объектом-владельцем и не содержит информации о нём.

3. Ну и последний минус — это конечно же производительность. Если объектов-владельцев достаточно много, то создание и уничтожение вместо одного объекта двух или более может не остаться

3. В чем проблема множественного наследования

Допустим, у нас есть классы Cow и Sniper, а мы хотим получить класс, который обладает данными и методами обоих классов. Назовем его CowSniper. Таким образом у нас есть возможность «скрещивать» классы. 1) Перекрытие имен функций Пусть в классах Cow и Sniper были методы sleep(). Тогда код: CowSniper cs; cs.sleep(); // 2 В строке 2 произойдет ошибка компиляции, т. к. компилятор не может выбрать какой метод sleep() ему вызывать (от Cow или от Sniper). Поэтому необходимо сообщимть ему правильный выбор: cs.Cow::sleep(); 2) Перекрытие виртуальных функций Теперь рассмотрим тот случай, если метод sleep() виртуальный в классах-предках. class Cow { public: virtual void sleep() = 0; }; class Sniper { public: virtual void sleep() = 0; }; class CowSniper: public Cow, public Sniper { public: virtual void sleep() {}}; В таком случае будут перегружены сразу оба метода (ведь у них одинаковая сигнатура). Подробнее о том почему это происходит написано в следующем пункте. Тогда в следующих строках кода: Cow & c = cs; Sniper & s = cs; c.sleep(); //3 s.sleep(); //4 В строках 3 и 4 вызовется один и тот же метод CowSniper::sleep(); 3) Представление объекта в памяти

4) Можно ли перегрузить или переопределить конструктор

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

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

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

5) Чем отличается инициализация от конструирования объекта

Инициализация (англ. initialization) — присвоение начальных значений полям объекта. Инициализация программы заключается в задании начальных значений или установке в нуль программных переменных (адресов, счетчиков, переключателей, указателей и т. п.) перед выполнением программы. Во многих языках программирования имеются средства определения начальных значений при первом описании переменной. В программных системах фаза инициализации, в которой конструируются объекты приложения и "склеиваются" основные зависимости, тоже должна отделяться от логии времени выполнения, получающей управление после ее завершения. Фаза инициализации присутствует в каждом приложении. Конструирование — деятельность по созданию материального образа разрабатываемого объекта Суть в том, что конструирование это создание объекта, а инициализация - присвоение начальных значений объекту.

6) Зачем используются дженерик объекты

Обобщения (Generics) позволяют указать ограничения, накладываемое на поведение класса или методов, в терминах неизвестных типов. Нередко создаваемые разработчиками алгоритмы могут быть успешно использованы для разных типов данных без какого-либо изменения. И чтобы не создавать одну и туже реализацию для каждого типа данных в языке Java были введены обобщения или обобщенные типы. Обобщенные типы позволяют создавать более безопасный и при этом универсальный код. Чтобы класс использовал обобщение, нужно сделать объявление обобщённого класса путём замены class name на class name , что создаст переменную типа T , которую можно использовать в любом месте данного класса. Синтаксис: class name { /* ... */ } С помощью буквы T в определении дженерик-класса указывается, что данный тип T будет использоваться этим классом. Параметр T в угловых скобках называется универсальным параметром, так как вместо него можно подставить любой тип. При этом пока мы не знаем, какой именно это будет тип, будет это класс или интерфейс. Буква T выбрана условно, это может и любая другая буква. Секция параметра типа, заключённая в угловые скобки <> , следует за именем класса. Она определяет параметры типа (parameter types, также называются параметрами типа) T1, T2 … Tn. После объявления класса мы можем применить универсальный параметр T: так далее в классе объявляются две переменные этого типа, которым затем присваиваются значения в конструкторе.

7. Динамическое связывание.

Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции − раннее связывание) и динамически (тип объекта определяется только во время выполнения программы − позднее связывание).

Позднее связывание (Latebinding) - ситуация, при которой адрес вызываемого метода неизвестен до момента выполнения программы. Адресация разрешается путем использования таблиц виртуальных методов с адресами методов.

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

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

8. В чем преимущество закрытой цепочки наследования?

//переписать более «красиво»

Смысл private методов и переменных, например, в том, чтобы разработчик наследуемых классов не лез в родительские реализации базового функционала.

//или

Для приватной области (private) присущи такие вещи как:

-сокрытия методов родительского класса;

-сокрытие реализации класса(начинки), чтоб программисты в этот алгоритм не вникали (работает правильно и хорошо зачем трогать)

9. Что такое раннее и позднее связывание (earlyandlatebinding)?

Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции − раннее связывание) и динамически (тип объекта определяется только во время выполнения программы − позднее связывание).

Позднее связывание (Latebinding) - ситуация, при которой адрес вызываемого метода неизвестен до момента выполнения программы. Адресация разрешается путем использования таблиц виртуальных методов с адресами методов.

Раннее связывание (Earlybinding) - ситуация, при которой адрес вызываемого метода известен в момент компиляции / компоновки.

Реализация позднего связывания в языке программирования позволяет создавать переменные − указатели на объекты, принадлежащие различным классам (полиморфные объекты), что существенно расширяет возможности языка.

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

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

10. Что такое "базовый класс", "подкласс" и "супер класс" (baseclass, subclass и superclass)?

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

11. В чем разница между полями и свойствами (property)?

Обычно поля используются для обеспечения выполнения операций внутри класса. Однако класс должен каким-либо образом взаимодействовать с другими классами или программными элементами приложения. В подавляющем большинстве случаев класс должен выполнить с некоторыми данными определенные действия и представить результат. Для получения и передачи данных в классе применяются свойства. Для объявления свойств в классе используется зарезервированное слово property.

12. В чем разница между полями и параметрами?

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

13.В чем преимущества неизменяемыми (Immutable) полей и классов

Immutable объект — это объект, состояние которого после создания невозможно изменить. В случае Java это значит что все поля экземпляра у класс отмечены как final и являются примитивами или тоже immutable типами.

public class ImmutablePoint {

private final int x;

private final int y;

private final String description;

public ImmutablePoint(int x, int y, String description) {

this.x = x;

this.y = y;

this.description = description;

}

}

После создания экземпляра ImmutablePoint его модификация невозможна. Простейший пример immutable класса из JDK это String. Любые методы, которые вы вызовите на строке (например description.toLowerCase()) вернут новую строку, а не модифицируют исходную. Пример mutable класс из JDK — Date. Например myDate.setHours(x) модифицирует сам экземпляр myDate! Есть разница между immutable-объектом (то есть, неизменяемым), и final-ссылкой. Ключевое слово final для объектных типов гарантирует неизменяемость лишь ссылки, но не самого объекта. Например, если у вас есть final-ссылка на ArrayList, вы тем не менее можете добавлять в него новые элементы или изменять существующие. В случае же immutable-объекта объект после окончания конструктора не изменяется вообще. Одного лишь модификатора final для этого недостаточно, необходимо, чтобы все подобъекты были тоже неизменяемыми. Вы в принципе можете держать внутри ссылку на изменяемый объект, но обращаться с ним так, чтобы он не менялся. Использование неизменяемых объектов даёт много выгод. Например, о таком объекте намного легче судить в ситуации, когда во многих частях программы есть ссылка на него (для изменяемого объекта, любая часть программы может вызвать мутирующую функцию в практически любой момент времени и из любого потока). Но то, что для нас важно в контексте вопроса — неизменяемые объекты не требуют синхронизации при многопоточном доступе. Вот собственно и вся рекомендация: используйте неизменяемые объекты, и вам не придётся думать о том, что нужно, а что не нужно синхронизировать. Единственная возможная проблема — если вы внутри ещё не отработавшего конструктора публикуете ссылку на объект, через которую к нему может получить доступ кто-нибудь ещё, и увидеть объект в изменяющемся состоянии! Обратите внимание, что для полей неизменяемого объекта вы практически обязаны использовать final! Дело в так называемой безопасной публикации. Инструкции в Java-программе могут быть переставлены как оптимизатором, так и процессором. Поэтому, если не предпринимать специальных действий, окончание работы конструктора и присвоение значений полям может быть переставлено! Использование final гарантирует, что такого не произойдёт. В случае многопоточного программирования преимущества immutable классов очевидны: после создания объекты можно передавать другим потокам и они всегда будут в актуальном состоянии. Т.е. вам не надо проверять не устарело ли состояние вашего экземпляра и не модифицировал ли его другой поток пока вы с ним работаете. Например, у вас есть метод bill(Date endDate), в нём вы наивно проверяете соответствие endDate каким-то предварительным условиям и начинаете с ней работать. В этот момент другой поток может изменить endDate, например установит её глубоко в прошлое. Последствия могут быть самыми удивительными.

14. Может ли класс верхнего уровня быть приватным?

Вложенные классы существуют только на уровне исходного кода. Виртуальная машина Java ничего не знает о вложенных классах. Она работает с обычными внешними классами. Для взаимодействия объектов вложенных классов компилятор вставляет в них специальные закрытые поля. Поэтому в локальных классах можно использовать только константы объемлющего метода, т.е. переменные, помеченные слово final. Виртуальная машина просто не догадается передавать изменяющиеся значения переменных в локальный класс. Т.о., не имеет смысла помечать вложенные классы модификатором private, все равно они выходят на самый внешний уровень..

15. Может ли абстрактный класс иметь конструктор и зачем?

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

16) Каким образом и зачем закрывать классы от наследования

В C# поддерживается еще одно ключевое слово — sealed, которое исключает наследование. Если класс помечен как sealed (запечатанный), компилятор не позволяет наследовать от него. Ниже приведен пример объявления класса типа sealed:

sealed class А {

// ...

// Следующий класс недопустим.

class В : А { // ОШИБКА! Наследовать класс А нельзя

//... }

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

Чаще всего запечатывание имеет смысл при проектировании служебного класса. Например, в пространстве имен System определено множество запечатанных классов.

Наиболее вероятная ситуация, когда может понадобиться пометить класс или метод как sealed — это когда класс или метод обеспечивает внутренние действия библиотеки, класса или других разрабатываемых классов, поэтому вы уверены, что любая попытка переопределить некоторую его функциональность приведет к нестабильности кода. Также можно помечать класс или метод как sealed из коммерческих соображений, чтобы предотвратить использование классов способом, противоречащим лицензионным соглашениям.

17) Что означает приватный конструктор

Закрытый конструктор — это особый конструктор экземпляров. Обычно он используется в классах, содержащих только статические элементы. Если в классе один или несколько закрытых конструкторов и ни одного открытого конструктора, то прочие классы (за исключением вложенных классов) не смогут создавать экземпляры этого класса. Примеры. class NLog { // Private Constructor: private NLog() { } public static double e = Math.E; //2.71828... } Объявление пустого конструктора запрещает автоматическое создание конструктора по умолчанию. Обратите внимание, что если не использовать с конструктором модификатор доступа, то по умолчанию он все равно будет закрытым. Однако обычно используется модификатор private, чтобы ясно обозначить невозможность создания экземпляров данного класса. Закрытые конструкторы используются, чтобы не допустить создание экземпляров класса при отсутствии полей или методов экземпляра, например для класса Math, или когда осуществляется вызов метода для получения экземпляра класса. Если все методы в классе являются статическими, имеет смысл сделать статическим весь класс.

18.Предложите альтернативу наследованию

Вместо наследования реализации во многих случаях может оказаться лучше использовать композицию

При композиции новый класс может использовать несколько экземпляров существующего класса

Композиция делает классы менее зависимым друг от друга, чем наследование.

Давайте рассмотрим такой пример: у нас есть класс, который предназначен для отправки данных по сети (пусть называется он «Sender»). И нас всё уставало до определенного момента, но потом мы решили, что данные перед отправкой в сеть нужно сжимать, например… Что мы можем сделать? Мы можем написать класс-наследник, базовым для которого будет уже используемый нами класс «Sender». И в классе-наследнике, реализовать дополнительную функциональность (собственно сжатие данных).

19. В чем разница между интерфейсом и абстрактным классом?

Интерфейс (interface) — это некая совокупность возможностей или методов выполнения операций над объектом или объектами;

Абстракция (abstraction) — придание сущности или объекту некоторых конкретных черт, отвергая при этом несущественных;

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

Основные положения при создании абстрактного класса

1. Абстрактный класс и абстрактный метод создаются с помощью ключевого слова abstract; 2. Абстрактный класс обязательно должен содержать в себе хотя бы один абстрактный метод; 3. Реализация абстрактного класса происходит через ключевое слово extends; 4. Класс может реализовать только один абстрактный класс; 5. Абстрактный класс, в отличии от интерфейса, может содержать реализованные методы; 6. Как и обычный класс может содержать поля, константы и методы с реализацией; 7. Абстрактные методы и поля можно объявлять с идентификаторами доступа public, protected, private и ,при реализации в классе, методы должны иметь такой же модификатор или менее ограниченный; 8. Абстрактные методы должны быть указаны явно через ключевое слово abstract; 9. При наследовании все методы, помеченные как абстрактные, должны быть реализованы в классе -потомке и ,при этом , область видимости этих методов должна совпадать (или быть менее строгой);

Основные положения при создании интерфейса

1. Класс не может реализовать 2 интерфейса, у которых одинаковые методы ибо возникнет неоднозначность вызова; 2. Интерфейсы могут быть унаследованы друг от друга, так же как и классы, с помощью оператора extends; 3. Сигнатуры(т.е. количество передаваемых переменных и название метода) методов в классе, реализующем интерфейс, должны точно совпадать с сигнатурами, используемыми в интерфейсе, в противном случае будет вызвана фатальная ошибка; 4. Интерфейсы могут содержать константы. Константы интерфейсов работают точно так же, как и константы классов, за исключением того, что они не могут быть перекрыты наследующим классом или интерфейсом, иначе говоря не могут быть переопределены; 5. Все методы интерфейса, по умолчанию, являются абстрактными; 6. Все методы интерфейса, по умолчанию, являются публичными; 7. Интерфейс не может реализовать содержащиеся в нем методы, реализует наследующий класс; 8. Класс может наследовать интерфейс через ключевое слово implements; 9. Класс может реализвовать и наследовать несколько интерфейсов через запятые и названия интерфейсов;

20. В чем разница между "ассоциацией", "агрегацией" и "композицией" (association, aggregation, composition)?

Ассоциация. Это просто связь между объектами, по которой можно между ними перемещаться. Ассоциация может иметь имя, показывающее природу отношений между объектами, при этом в имени может указываться направление чтения связи при помощи треугольного маркера. Однонаправленная ассоциация может изображаться стрелкой.

Ассоциация с агрегированием. Обычно при ближайшем рассмотрении под ассоциацией понимается более сложное отношение между классами, например, связь типа "часть-целое". В этом случае один класс имеет более высокий статус (целое) и состоит из низших по статусу классов (частей). При этом выделяют простое и композитное агрегирование и говорят о собственно агрегации и композиции.

Простая агрегация предполагает, что части, отделенные от целого, могут продолжать свое существование независимо от него.

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

Винчестер можно вынуть из компьютера и установить в новый компьютер или в USB-карман, т. е. существование жесткого диска с разборкой системного блока не заканчивается. А вот кнопки без окон обычно существовать не могут - с закрытием окна кнопки также исчезают.

ЛИБО ПРОЩЕ!!!

Ассоциация обозначает связь между объектами. Агрегация и композиция это частные случаи ассоциации. Агрегация предполагает, что объекты связаны взаимоотношением "part-of" (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию part-of накладывается условие, что "часть" не может одновременно принадлежать разным "хозяевам", и заканчивает своё существование вместе с владельцем. 1 пример мотоцикл -> cумка с багажём - ассоциация. Отношение "имеет". мотоцикл -> колесо - композиция. группа по интересам -> человек - агрегация. человек часть группы, но может принадлежать нескольким разным группам.

2 пример

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

21. В чем разница между патернами "декоратор" и "адаптер" (decorator, adapter)?

Адаптер, Adapter— структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.

Декоратор, Decorator — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности.

Адаптер - частный случай декоратора. · Adapter придает своему объекту новый интерфейс, а Decorator обеспечивает расширенный интерфейс.

· Adapter изменяет интерфейс объекта. Decorator расширяет ответственность объекта. Decorator, таким образом, более прозрачен для клиента. Как следствие, Decorator поддерживает рекурсивную композицию, что невозможно с чистыми адаптерами.

23. Что такое "предусловия", "постусловия" и "инварианты"? Могут ли они быть ослаблены или усилены в подклассах?

Предусловия и постусловия описывают свойства отдельных программ. Но экземпляры класса обладают также глобальными свойствами. Их принято называть инвариантами класса (class invariants), и они определяют более глубокие семантические свойства и ограничения целостности, характеризующие класс.

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

· предусловия, которые могут быть ослаблены (но не усилены) в подклассах;

· постусловия, которые могут быть усилены (но не ослаблены) в подклассах;

· инварианты, которые могут быть усилены (но не ослаблены) в подклассах;

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

Постусловия (Postconditions) не могут быть ослаблены в подклассе. То есть подклассы должны выполнять все постусловия, которые определены в базовом классе.

24. У какого класса нет конструктора?

Невозможно создать объект класса у которого единственный private конструктор за пределами класса. Поэтому нельзя унаследоваться от такого класса. При попытке унаследоваться будет выдаваться ошибка: There is no default constructor available in имяКласса. А при попытке создать объект этого класса: ИмяКласса() has private access in ИмяКласса

25. Что такое анонимный класс?

Анонимный класс – это локальный класс без имени.Анонимные классы эффективно используются, как правило, для реализации (переопределения) нескольких методов и создания собственных методов объекта. Так же когда локальный класс используется всего один раз, можно применить синтаксис анонимного класса, который позволяет совместить определение и использование класса.

26. Когда методы и свойства класса вызывают по имени класса?

27. Дать определение терминам "DRY", "KISS", "YAGNI".

KISS — Keep It Simple, Stupid! (делайте вещи проще) — не нужно усложнять дизайн там, где в этом нет необходимости. Чем проще, тем лучше.

DRY — Don’tRepeatYourself (не повторяйтесь) — не нужно «изобретать велосипед». Любой функционал в коде должен быть реализован ровно один раз, не говоря уже о том, что copy-paste-кода вообще не должно быть.

YAGNI — YouAin’tGonnaNeedIt (вам это не понадобится) — нужно ориентироваться на реальную экономическую необходимость. Если от кода не требуется каких-то вещей, то не нужно их реализовывать. Например, если вы работаете над маленьким сайтом, который надо сдать в сжатые сроки, и который приурочен к одному мероприятию, после чего будет закрыт, то не надо продумывать его архитектуру с точки зрения возможного расширения функционала в будущем. В общем, надо оценивать необходимость своего труда взвешенно.

28. Дженерики (generics) и преимущества их использования. Привести пример.

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

Основные преимущества использования обобщений: производительность, безопасность, повторное использование двоичного кода, "разбухание" кода

//можно в кач-веприера привести только 1 класс

namespace ConsoleApplication1

{

// Создадим обобщенный класс имеющий параметр типа T

classMyObj

{

T obj;

publicMyObj(T obj)

{

this.obj = obj;

}

public void objectType()

{

Console.WriteLine("Типобъекта: " + typeof(T));

}

}

// Обобщенный класс с несколькими параметрами

classMyObjects

{

T obj1;

V obj2;

E obj3;

publicMyObjects(T obj1, V obj2, E obj3)

{

this.obj1 = obj1;

this.obj2 = obj2;

this.obj3 = obj3;

}

public void objectsType()

{

Console.WriteLine("\nТипобъекта 1: " + typeof(T)+

"\nТипобъекта 2: " + typeof(V) +

"\nТипобъекта 3: " + typeof(E));

}

}

class Program

{

static void Main()

{

// Создадим экземпляр обобщенного класса типа int

MyObj obj1 = new MyObj(25);

obj1.objectType();

MyObjects obj2 = new MyObjects("Alex",26,12.333m);

obj2.objectsType();

Console.ReadLine();

}

}

}

29. Чтотакоежизненныйциклобъекта?

Жизненный цикл – время от момента построения объекта, его использования, до момента его уничтожения.


написать администратору сайта