Ответы по итоговому опросу программирование С#. Ответы. 1. Что такое ооп Понятие классов
Скачать 28.68 Kb.
|
1. Что такое ООП? Понятие классов. ООП - принцип в программировании при котором код представляется в виде некоторых объектов-классов обладающих полями (описывающими их) и функциями (отражающими действия объекта). В ООП имеется такое понятие как класс - можно сказать что это шаблон по которому создаются экземпляры определенных объектов (которых отражает наш класс). 2. Инкапсуляция: для чего, способы достижения, примеры Инкапсуляция - это принцип при котором мы скрываем (вкладываем в обертку) некоторые части нашего кода оставляя в доступности только те части кода, что необходими конечному пользователю (программисту) для работы с ним. Это необходимо для обеспечения безопасной и надежность (устойчивость к сбоям. Например когда конечный пользователь напрямую влияет на поле в обход свойства. что может привести к не активации необходимого для правильной работы класса ивента.) Инкапсуляция достигается благодаря модификаторам доступа и свойствам. Они являются по сути двумя сторонами одной монеты: модификаторы доступа запрещают человеку взаимодействовать с частями кода, а свойства наоборот предоставляют доступ через специально отведенные для этого функции get и set. примеры: сокрытие поля name модификатором доступа private и предоставление к ним доступа через свойство Name. 3. Абстракция Абстракция - Это нечто что не имеет конкретного представления (экземпляра) в реальности и объединяет в себе некоторую группу свойств присоедененных к абстракной группе объектов (например деревья: это слово описывает объекты имеющие определенные свойства, которые мы точно можем указать: количество ветвей, название и т.д. Однако самого как такового экземпляра дерева нет, потому что оно представляет из себя абстрактный набор свойств присущих различным классам, таким как например березы, сосны, дубы) 4. Полиморфизм: готовьте пример Полиморфизм - это принцип согласно которому наследуемые объекты условно имеют представление в виде базовых объектов. Так например можно представить любой объект как object (т.к. все объекты наследуются от object) и записать в массив object-ов string-ги или например наш собственный класс. А потом для всех них выполнить функцию "ToString" (При желание ее можно переопределить в нашем классе) и в итоге для каждого отдельного экземпляра класса в массиве object-ов выполнится своя версия "ToString" 5. Наследование: как реализуется. Что наследуется/не наследуется Наследование - возможность одного класса условно стать подвидом (наследником) другого класса при этом переняв его функции, свойства, поля и методы. Стоит замететить что при наследование не наследуется конструктор и при создании конструктора класса наследника мы можем (вынуждены) использовать слово base для передачи значений в класс-родитель. Так же возможно стоит упомянуть что наследование открывает нам возможность использовать полиморфизм и записывать классы-наследники в переменные базовых классов 6. Точка входа в консольное приложение Точкой входа в консольное приложение является функция main. Она принимает в себя массив string-ов args который мы можем задать при запуске нашего консольного приложения через командную строку (через скомпилированный exe файл указав аргументы после вызова) 7. Почему в классе Program создаются статические методы, а не обычные Причиной этому является то что класс Program представляет из себя саму нашу пограмму что запускается через main. Конечно мы можем создать экзе 8. Всё о циклах Циклы делятся на 3 типа: цикл с условием while( условие ) - цикл что выполняется в том случае и до тех пор пока условие выполняется цикл с постусловием do {} while( условие ) - цикл что выполняется в любом случае (единожды) и до тех пор пока условие выполняется цикл с параметрами for (задание параметров; условие; изменение параметров с каждой итерацией) - цикл обладающий параметрами, что в процессе прохождения цикла (на каждом круге/итерации) как либо изменяются. Аналогично другим циклам будет выполняться до тех пор пока словие выполняется. 9. Условные выражения и конструкции if ( условие ) - если данное условие в коде выполняется идет тело этой функции (все последующии с else не выполняются) else if ( условие ) - выполняется если предидущие условия не были выполнены, но наше условие выполнилось. else - выполняется если ни одно предидущее условие не было выполнено. 10. Статические члены Общие и единственные в своем роде для всей программы члены. В случае классов не могут иметь экземпляров (условно существует один единственный для всей системы экземпляр), а в случае функций будут вызываться не на экземплярах класса а на самом классе. 11. Ссылочные и значимые типы Ссылочные и значимые типы - значимые типы (int, doube, float, byte и т.д [возможно и char]) представляют из себя определенное значение (Не обладающее столь сложной структурой, как например классы). Хранятся в стеке. Ссылочные типы - типы что обладают некоторой "ссылкой" адресом в куче, по которому и осуществляется доступ к данным/значениям. (string, object, любые наши классы) !!!ВАЖНО ПОМНИТЬ!!! При присвоение одной переменной с ссылочным типом к другой передается ссылка на значение, но не само значение так что при изменение значения в одной переменной будет и менять значение в другой. А при присвоение переменной например null с нашими данными к которым вела наша ссылка вообще ничего не произойдет. Просто переменной присвоится пустая ссылка. Эти данные удаляются с помощью "сборщика муссора" что высвобождает затрачиваемую на хранение наших объектов память. !!! Вспомните фокусы !!! 12. Передача данных в метод по ссылке и по значению. Именованные параметры. Ключевое слово params Именнованные параметры - возможность передать параметры в функцию напрямую обращаясь к параметру по имени Пример: ThrowMessage( message:"Выведи это сообщение" ) мы напрямую указываем значение параметра message Переда данных по ссылке и по значению - это различные способы передачи данных внуть методов. Так просто передавая в метод значимый тип - мы передаем лишь его значения. При работе программы значение переменной которую мы передали извне не изменится при изменении ее в процессе работы метода. При передачи же ссылки с помощью ключевого слова ref мы сможем напрямую взаимодействовать с значением переменной переданной извне и работать с переданной переменной как с ссылочным типом. Помимо этого имеются так же ключивые слова out и in: out - позволяет передать переменную в которую после работы присвоится определенное выходное значение in - позволяет создать переменные которые в ходе метода вообще никак не могут меняться. params - позволяет передать в метод массив с неопределенным количеством эллементов. К примеру благодаря парамс мы можем делать так: LettersToMessage(params char[] letters) LettersToMessage('д','а'); LettersToMessage('п','р','и','в','е','т'); 13. Перегрузка конструкторов, перегрузка методов перегрузка - способ создать несколько вариаций одних и тех же методов и конструкоторов. Это происходит благодаря видоизменению сигнатуры (имя + количество параметров/типы параметров) методов и конструкторов с сохранением имени, но изменением входных параметров. !!!ВАЖНО!!! Возвращаймый тип не относится к сигнатуре. ???Дополнительно??? При перегрузке конструкторов есть возможность создать цепочку конструкторов с использованием ключевого слова :this(параметры), где вся эта конструкция - сигнатура предидущего в цепочке конструктора. 14. Свойства, автосвойства, значения по умолчанию в классах и функциях Свойства - Условная конструкция созданная для взаимодействия с полями через методы, но не напрямую. Один из способов инкапсуляции. В свойствах фигурируют такие ключевые слова(методы) как get и set, где get - получение значения поля, set - присвоение значения value нашему полю. Автосвойства - свойства которые автоматически при компиляции генерируют поле с которым они работают. Например: string Name{ get; set; } = "Воланд" Так же в вышеуказаном примере в них можно установить значения по-умолчанию. Значения по-умолчанию - значения которые присваиваются в переменные если в них программистом во время работы напрямую не было присвоено какое либо значение. Например: int Sum(int x, int y = 12) {return x+y;} - здесь значение y всегда будет присваиваться 12, если при вызове функции его не указать. 15. Класс Object его назначение и содержимое. Класс Object - базовый класс для всех классов. Представляет из себя некоторый объект. Обладает след методами: Equals(Object) - Определяет, равен ли указанный объект текущему объекту. static Equals(Object, Object) - Определяет, считаются ли равными указанные экземпляры объектов. Finalize() - Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как он будет уничтожен во время сборки мусора. GetHashCode() - Служит хэш-функцией по умолчанию. GetType() - Возвращает объект Type для текущего экземпляра. MemberwiseClone() - Создает неполную копию текущего объекта Object. ReferenceEquals(Object, Object) - Определяет, совпадают ли указанные экземпляры Object. ToString() - Возвращает строку, представляющую текущий объект. 16. Переопределение (override) Возможность так или иначе видоизменить исполнение вируального (virtual) или абстрактного (abstact) метода унаследованного от базового класса. 17. Глубокое и поверхностное копирование Поверхностное копирование - копирование без учета содержимого. Только лишь значения, без создания отдельных объектов и с сохранением ссылок на старые объекты. Примером такого копирования может послужить функция MemberwiseClone. Глубокое копирование - копирование с учетом вложенных классов. При таком копировании создаются и отдельные копии всех экземпляров классов что находятся внутри копируемого объекта. 18. Внутренние классы Внутренние классы - классы созданные внутри других классов. Доступ к их конструктором осуществляется через внешний класс. Часто представляются из себя вспомогательные классы необходимые для функционирования основного класса.(Например при работе с event-ами) Имеют модификаторы private public protected internal. 19. Преобразование типов. Способы применения. Преобразование типов - возможность перехода одного типа в другой. Бывает явным и неявным. Преобразование происходит если переопределен оператор implicit. В этом случае спокойно можно использовать как явное, так и неявное приобразования: int x = 8; double xd = x; double xd = (double) xd; В случае же когда не был переопределен implicit и нет возможности явно преобразовать из одного типа в другой будет выдано исключение. !!!ТУТ ХЗ ЕС ЧЕСТН!!! 20. Code style. Code convention. Naming convention Принципы и конвенции. Правила хорошего тона при написание кода. Там табуляция + правильное название эл-ов кода (функции с заглавной, поля с маленькой и т.д.) + читаемость кода (Нормальное указание тела функции у if - if() {!!!}) 21. Интерфейсы в C#. Как ими пользоваться и для чего? Интерфеисы - Наборы методов, свойств, индексаторов и событий, что определяются создателем интерфеиса для того, чтобы наши наследники могли реализовать данные действия. Созданы для того, чтобы разные программисты не называли одни и те же действия разными именами. Такая координация действий значительно упрощает взаимодействие между программистами ведь каждый так или иначе понимает о чем идет речь в том или ином интерфеисе. Так же неплохо комбинируется с полиморфизмом - позволяет создать переменные принимающие в себя только те классы что обладают определенным интерфеисом. 22. Интерфейсы IEnumerable, IEnumerator, ICloneable, IComparer, IComparable. Пример использования ICloneable - определяет возможность нашего класса к клонированию. IEnumerable - определяет возможность перечисления нашего класса при помощи возвращаемого функцией GetEnumerator енумератора (может быть заменено словом yield). IEnumerator - определяет что данный класс - перечеслитель, что пробегается по некоторому классу и возвращает из него след значение. IComparable - определяет возможность нашего классы сравнивать себя (this) с другим объектом (object) или (если IComparable<Наш класс>) другим экземпляром нашего класса. IComparer - определяет что данный класс - сравниватель (сортировщик), класс что может сравнивать два объекта (экземпляпляра класса). Интерфейсы IEnumerable используется при работе foreach(), а IComparable - при работе метода Sort() 23. Перечислитель. Принцип работы и использование IEnumerable. IEnumerator. Класс указаный как перечисляемый (IEnumerable) обладает методом GetEnumerator что позволяет вернуть перечислитель - класс для итерирования по массиву представленному в нашем классе Класс перечеслитель хранит в себе позицию (position) из которой он берет значения (изначально равно -1), массив из которого он берет значения, свойство current, как метод доступа к текущему значению, а так же методы MoveNext и Reset для перемещения позиции считывания из массива. Данный класс может быть заменен ключевым словом yield. 24. Методы для сортировки данных. Примеры, как, с помощью чего работают? IComarable. IComparer. IComparable - определяет возможность нашего классы сравнивать себя (this) с другим объектом (object) или (если IComparable<Наш класс>) другим экземпляром нашего класса. Использует метод ComapareTo(objec? obj) возвращающий "относительную позицию" нашего эл-та по отношению к сравниваему (если он больше 1, меньше -1 и если они равны 0). IComparer - определяет что данный класс - сравниватель (сортировщик), класс что может сравнивать два объекта (экземпляпляра класса). Использует метод Compare(object? x, object? y) возвращающий "относительную позицию" x по отношению к y (1,0,-1) 25. Обобщенное программирования. В чем идея? Какую проблему решает? Обобщеное программирование - предоставление пользователю возможности указать с каким именно типом или классом будет работать наш код. При этом появляется возможность сразу определить например какой тип данных у нас будет возвращать наш метод работая с разными типами, такими как int или double. По сути это достигается путем генерации при компиляции отдельных классов с теми типами, с которыми мы хотим работать. 26. Обобщения в классах. Примеры таких классов Обобщение в классах позволяет создать нам класс с типом, который может меняться в зависимости от указанного значения. !!!СМОТРЕТЬ 25 ВОПРОС!!! Примером такого класса может послужить класс List 27. Обобщения в методах. Примеры использования Обобщение в методах позволяет нам генерировать различные методы которые будут работать с указаными нами типами. static void Sum { Console.WriteLine(x + y); } !!!Пример не очень!!! 28. Обобщения в интерфейсах. Пример подобного интерфейса Обобщения в интерфеисах позволяют нам генерировать такие интерфеисы, которые будут работать с определенными типами данных. IComparable 29. Ограничения обобщений С помощью ключевого слова where возможно ограничить обобщения. Например указав что наш класс T должен обязательно наследоваться от другого класса. static void Sum {Console.WriteLine(x + y)} !!!Плохой пример но я туплю!!! 30. Обработка исключений. В каких случаях применяется? Какие блоки для чего предназначены? Обработка исключений применяется в тех случаях когда нам необходимо уловить ошибку и как либо ее обработать. Например в случае с потоками, если у нас возникнет ошибка нужно в обязательном порядке закрыть поток, дабы тот не перекрывал доступ к файлу. try - блок ловящий внутри себя исключения catch - блок обрабатывающие пойманые try-ем исключения final - блок срабатывающий после работы всех остальных блоков в обязательном порядке. !!!Писать много пишу пишу эти стримы а они убивают меня... Т-Т... Он же вроде вообще говорил что их на экзамене не будет!!! 31. Потоки (Stream). Классификация, для чего используются? Правила работы. Потоки - способ работы с файлами. Представляют из себя некоторую связь с файлом, позволяющую записывать и читать из них данные. Потоки читают файлы в виде битов и после передают их кусочками в нашу программу. Преобразованием же битов занимаемся либо мы (создавая классы-адапторы), либо созданные для этого потоковые адапторы. Важно помнить что подобная связь может существовать всего одна, так что очень важно закрывать потоки, чтобы не возникало конфликта из-за отсутствия возможности связаться с файлом. !!! НЕ УВЕРЕН ЧТО ТУТ ПРАВИЛЬНО !!! По сути работая с потоками и файлами можно выделить четыре типа классов: 1.Экземплярные классы для работы с файлами. ( например FileInfo, DirectoryInfo ) 2.Статические классы для работы с файлами. ( например File, Directory ) 3.Потоки ( например FileStream, NetworkStream ) 4.Потоковые адапторы ( например StreamReader/Writer StingReader/Writer) 32. Классы для работы с файловой системой. 1.Экземплярные классы для работы с файлами. ( например FileInfo, DirectoryInfo ) 2.Статические классы для работы с файлами. ( например File, Directory ) 33. Делегаты. Что это? Какие возможности в себе несут? Делегат - это некоторые объекты, что представляют из себя нечто вроде контейнеров, позволяющих сохранять внутри себя ссылки на функции, а так же вызывать функции привязаные к ним. Если говорить более лаконично это объекты реализующие механизм обратного вызова. Условно это пространство куда конечный пользователь может добавить свои функции. По сути делегаты это скрытые (за огромным слоем синтаксического сахара) классы. Которые хранят в себе _target (целевой объект на котором вызывается функция в том случае, когда наша функция экземплярная), _methoddptr (условная ссылка на вызываемый метод) и _invocationlist (ссылка на массив делегатов отражающий цепочку вызываемых функций). 34. Стандартные делегаты. Обобщенные делегаты Action и его обобщения Action либо ничего, либо объекты типа Predicate Func аргументы типов T,T1,T2 и т.д. 35. Регистрация делегатов !!!НЕ УВЕРЕН ЧТО ЭТО ВООБЩЕ ТО О ЧЕМ Я ПОДУМАЛ!!! т.к. делегат это нечто подобное классу (По сути это и есть класс, просто скрытый) для начала нам нужно создать экземпляр этого делегата. После создания к данному экземпляру можно будет привязать функции которые должны соответствовать нашему делегату. Привязка функций на деле подразумевает создание нового экземпляра делегата что добавится в список _invocationlist и будет вызываться при вызове основного делегата. 36. События Система событий условно подразумевает под собой некоторую систему уведомлений позволяющую благодаря механизму обратного вызова делегата уведомлять классы-"подписчики" об некотором событии и передавать необходимую нам информацию через них. У событий есть много плюсов, таких как например возможность более отказоустойчивой работы с запросами (потоками, Thread-ами), а так же возможность очень простой привязки и отвязки методов от нашего события. (классу-источник неважно это поскольку присвоение происходит сразу не через =, а через +=/-=). Система событий реализована благодаря ключевому слову event и стандартному делегату EventHandler передающему класс-источник и класс EventArgs (в который мы можем запихивать свой вспомогательный класс наследующий EventArgs... ура полиморфизму!!! [ если конечно мы не используем обобщенный EventHandler 37. Ключевое слово event event - ключевое слово позволяющее обозначить что наш делегат является событием. Запрещает присваивать наш делегат через = (чтобы не потерять всех подписчиков), а требует "подписки" через +=. !!!Смотреть вопрос 36!!! 38. Отличия объектов делегатов от объектов события По сути события это специализированные делегаты. Их основная цель уведомлять неопределенное количество "подписчиков" о том что произошло какое-либо событие. Для этого запрещается присвоение через = (чтобы не потерять всех подписчиков). Так же события более эффективны при работе с Thread-ами. !!!Смотреть вопрос 36!!! 39. Сигнатуры событий. Стандартная сигнатура. По сути речь идет про EventHandler и о том что тут передается в обязательном порядке наш this (экей класс-источник) и некоторый EventArgs, что принимает аргументы события чаще всего отражающие изменение в результате которых было вызвано наше событие. !!!Опять же смотреть вопрос 36 там все более подробно рассписано!!! 40. Регистрация событий !!!Опять же не уверен о чем речь!!! Регистрация событий происходит почти так же как делегата. Однако есть особенности: Мы передаем в обязательном порядке this/источник события, а так же класс EventArgs, что отражает аргументы связанные с нашим событием. Подписка происходит уже без первого присвоения со знаком = и становится в целом невозможным использование знака =. 41. Механизмы обратного вызова Механизм реализуемый благодаря делегатам. По сути это возможность оставить место для подключения к нашему классу иных функций и последующий вызовв этих функций в процессе работы нашего класса благодаря делегату. 42. Стандартные события, делегат EventHandler !!!Опять же тут речь идет только про EventHandler!!! Стандартным событием является EventHandler и его обобщение EventHandler имеет вид. По стандарту имеет вид EventHandler EventName(object sender, EventArgs e). !!!Смотреть 36 вопрос!!! 43. Анонимные классы ??? (maybe речь о методах, не!? Дядя тут ошибочка походу как бы да?) Анонимные методы - методы что не обладают именем и вызываются благодаря делегатам. Используются в тех случаях когда быстрее будет написать анонимный метод вместо того, чтобы писать отельный метод с именем. Реализуется вот так: NameNekotorogoDelegata NahNekotoriyDelegat = delegate(string mes) { Console.WriteLine($" Наше некоторое собщение: {mes}"); } 44. Лямбда-выражения Более быстрая форма записи анонимного метода. NameNekotorogoDelegata NahNekotoriyDelegat = (mes) => { Сonsole.WriteLine($" Наше некоторое собщение: {mes}"); } При этом тип mes берется из нашего делегата (В данном случае NameNekotorogoDelegata походу принимает 1 string) 1)Объектно-Ориентированное Программирование (ООП) – ООП нужно для того, чтобы программисту было легче работать с кодом 2)Инкапсуляция – скрытие кода от пользователя 3)Абстракция – придание объекту характеристик, которые отделяют его от других объектов чётко разделяя его границы 4)Полиморфизм – нужен для того, чтобы подкласс мог определить свою собственную реализацию метода из наследуемого класса 5)Наследование – механизм, позволяющий описать новый класс на основе существующего 6)Main* 7)- 8)Цикл – конструкция для многократного исполнения инструкций, пока они выполняют условие цикла (for, foreach, while, do…while) 9)Условные выражения – возвращают логические значения (bool = true | false) Конструкции – if/else, switch/case 10)static 11)Ссылочные – object, string, class, interface, delegate (Heap) Значимые – int, long, char, decimal, bool и тд. (Stack) (struct, enum) 12)- 13)Перегрузка конструкторов – создание нескольких конструкторов в классе Перегрузка методов – создание нескольких методов 14)- 15)Object – базовый класс от которого наследуются другие 16) Stack – используется для хранения переменных, операция над переменными, для вызова методов, организация логики выполнения программы (мало но быстро) Heap – Для хранения данных, когда stack переполнен (32 бит проц – 1.5 гб ОП, 64 – 8 тр) (много но медленно) |