Результати пошуку
ITVDN: курси програмування
Відеокурси з
програмування
Підписка

300+ курсів за популярними IT-напрямками

Вибери свою IT спеціальність

Підписка
Підписка

300+ курсів за популярними IT-напрямками

Результати пошуку за запитом: mvc 5*
Використання LINQ на об'єктах у мові C#

Автор: Редакція ITVDN

Введение Применение LINQ к объектам подразумевает, что можно использовать LINQ для запроса объекта из коллекции. Возможно использование LINQ для получения доступа к структурам данных, хранящихся в оперативной памяти (в структурах данных in-memory). Возможно запросить любой тип объекта, который реализует интерфейс IEnumerable или IEnumerable, относящийся к общему типу. Списки, массивы, словари – некоторые коллекции объектов, запрашиваемые с помощью LINQ. В этой статье будет показано, как выполняется запрос различных объектов с использованием операторов LINQ и избегается необходимость использования метода зацикливания для фильтрации данных. Не используя LINQ, необходимо проходить через значения снова и снова, а затем находить необходимые детали. Однако, с помощью LINQ можно запросить непосредственно сами коллекции данных и отфильтровать искомые значения, не используя зацикливание. LINQ предоставляет мощные возможности по фильтрации, группировке и упорядочиванию, не требующие больших объемов исходного кода. Например, если необходимо выяснить типы, хранящиеся в сборке, затем отфильтровать необходимые данные, можно использовать LINQ для запроса деталей сборки, используя классы System.Reflection. Пространство имен System.Reflection содержит типы, извлекающие информацию о сборках, модулях, членах, параметрах и других объектах как о коллекциях управляемого кода, исследуя их метаданные. Кроме того, файлы в папке представляют собой набор объектов и эти объекты можно запросить, используя LINQ. Далее будут представлены некоторые примеры запросов. Массив целых чисел Следующий пример демонстрирует целочислительный массив, содержащий некоторый набор целых чисел. Можно применить запросы LINQ в массиве для извлечения требуемых значений. int[] integers = { 1, 6, 2, 27, 10, 33, 12, 8, 14, 5 };        IEnumerable twoDigits =        from numbers in integers        where numbers >= 10        select numbers;        Console.WriteLine("Integers > 10:");        foreach (var number in twoDigits)        {           Console.WriteLine(number);        } Переменная integers содержит массив целых чисел с разными значениями. Переменная twoDigits, имеющая тип IEnumerable, проводит запрос. Для получения результата необходимо выполнение запроса. Исполнение запроса произойдет, когда переменная запроса будет итерироваться в цикле вызовом GetEnumerator() для перечисления результата. Любая переменная типа IEnumerable может быть перечислена с использованием цикла foreach. Типы, поддерживающие IEnumerable или производный интерфейс, например, IQueryable, называют запрососпособными типами. Присутствуют также некоторые нетипичные коллекции данных, например, ArrayList, которые также могут быть запрошены с помощью LINQ. Для этого необходимо явно объявить тип ранжированной переменной для конкретного типа объекта в коллекции, как в примерах ниже. Переменная twoDigits проведет запрос для извлечения значений, которые не меньше 10. Таким образом одно за другим извлекаются числа из массива. Цикл будет выполнять запрос, а затем будет выводить в консоль значения, полученные из массива. Как можно заметить, выше продемонстрирован достаточно простой способ получения необходимых данных из коллекции. Если нужны только первые четыре значения коллекции, можно использовать метод запроса Take() на необходимой коллекции. Ниже написано, как можно извлечь первые четыре элемента коллекции и вывести их в консоль, используя цикл. IEnumerable firstFourNumbers = integers.Take(4);    Console.WriteLine("First 4 numbers:");    foreach (var num in firstFourNumbers)    {       Console.WriteLine(num);    } Противоположность метода Take() – оператор Skip(), который используется для пропуска определенного количества первых элементов и получения остальных. В примере ниже будет пропущено первые 4 элемента.  ​IEnumerable skipFirstFourNumbers = integers.Skip(4);    Console.WriteLine("Skip first 4 numbers:");    foreach (var num in skipFirstFourNumbers)    {       Console.WriteLine(num);    } В примерах выше было продемонстрированно, как извлечь/пропустить определенное количество начальных элементов списка. Если необходимо извлечь/пропустить заранее неизвестное число элементов, используются методы TakeWhile() и SkipWhile(), которые работают, пока не будет найдено совпадение. В коде ниже будет изображено, каким образом получить все номера из коллекции, которые стоят до значения 50. TakeWhile() использует выражение для включения элементов коллекции, пока условие истинно, и игнорирует другие элементы списка. Выражение представляет собой условие, проверяющее элементы коллекции на совпадение. int[] integers = { 1, 9, 5, 3, 7, 2, 11, 23, 50, 41, 6, 8 };    IEnmerable takeWhileNumber = integers.TakeWhile(num =>       num.CompareTo(50) != 0);    Console.WriteLine("Take while number equals 50");    foreach (int num in takeWhileNumber)       {          Console.WriteLine(num.ToString());       } Подобным образом работает и метод SkipWhile(), только он пропускает значения, а не извлекает их. Самая высокая эффективность использования данных методов наблюдается при их использовании на упорядоченных списках, т.к. их выполнение прекращается при первом невыполнении условия поиска. IEnumerable skipWhileNumber = integers.SkipWhile(num =>       num.CompareTo(50) != 0);    Console.WriteLine("Skip while number equals 50");    foreach (int num in skipWhileNumber)    {       Console.WriteLine(num.ToString());    } Коллекции объектов В этом разделе будет показано, каким образом можно запросить произвольную коллекцию объектов. Будет использован объект Icecream, построена коллекция, после чего ее можно будет запросить. Класс Icecream в следующем коде содержит различные свойства (имя, ингредиенты, вес, холестерин и т.д.) public class Icecream     {         public string Name { get; set; }         public string Ingredients { get; set; }         public string TotalFat { get; set; }         public string Cholesterol { get; set; }         public string TotalCarbohydrates { get; set; }         public string Protein { get; set; }         public double Price { get; set; }     } Далее строится список Icecreams, используя ранее определенный класс. List icecreamsList = new List         {             new Icecream {Name="Chocolate Fudge Icecream", Ingredients="cream,                 milk, mono and diglycerides...", Cholesterol="50mg",                 Protein="4g", TotalCarbohydrates="35g", TotalFat="20g",                 Price=10.5         },         new Icecream {Name="Vanilla Icecream", Ingredients="vanilla extract,             guar gum, cream...", Cholesterol="65mg", Protein="4g",             TotalCarbohydrates="26g", TotalFat="16g", Price=9.80 },             new Icecream {Name="Banana Split Icecream", Ingredients="Banana, guar             gum, cream...", Cholesterol="58mg", Protein="6g",             TotalCarbohydrates="24g", TotalFat="13g", Price=7.5 }         }; Имеется коллекция icecreamsList, состоящая из трех объектов со значениями типа Icecream. Пусть теперь необходимо извлечь всё мороженное, стоящее меньше 10. Можно использовать зацикливание, при котором необходимо смотреть на цену каждого элемента списка друг за другом, затем извлечь объекты, которые имеют меньшие значения поля Price. Использование LINQ позволяет избежать итерирования всех объектов и их свойств для поиска необходимых, т.е. облегчает поиск. Далее будет представлен запрос, выбирающий мороженое с низкими ценами из коллекции. Для работы запрос использует оператор where. Внешне запрос напоминает запрос из реляционной БД. Запрос выполняется, когда переменная типа IEnumerable перечислена в цикле. List Icecreams = CreateIcecreamsList();     IEnumerable IcecreamsWithLessPrice =     from ice in Icecreams     where ice.Price < 10     select ice;     Console.WriteLine("Ice Creams with price less than 10:");     foreach (Icecream ice in IcecreamsWithLessPrice)     {         Console.WriteLine("{0} is {1}", ice.Name, ice.Price);     } Также можно использовать ArrayList для хранения объектов, как было использовано List. Запрос LINQ, в таком случае, можно использовать для получения конкретных объектов из коллекции в зависимости от потребности. Например, нижеследующий код для добавления тех же самых объектов Icecreams в ArrayList, как это делалось в предыдущем примере.     ArrayList arrListIcecreams = new ArrayList();     arrListIcecreams.Add( new Icecream {Name="Chocolate Fudge Icecream",         Ingredients="cream, milk, mono and diglycerides...",         Cholesterol="50mg", Protein="4g", TotalCarbohydrates="35g",         TotalFat="20g", Price=10.5 });     arrListIcecreams.Add( new Icecream {Name="Vanilla Icecream",         Ingredients="vanilla extract, guar gum, cream...",         Cholesterol="65mg", Protein="4g", TotalCarbohydrates="26g",         TotalFat="16g", Price=9.80 });     arrListIcecreams.Add( new Icecream {Name="Banana Split Icecream",         Ingredients="Banana, guar gum, cream...", Cholesterol="58mg",         Protein="6g", TotalCarbohydrates="24g", TotalFat="13g", Price=7.5     }); Следующий запрос выбирает недорогое мороженое из списка. var queryIcecreanList = from Icecream icecream in arrListIcecreams     where icecream.Price < 10     select icecream; Как будет показано ниже, можно использовать цикл для отображения цены объектов, извлеченных вышеуказанным запросом. foreach (Icecream ice in queryIcecreanList)     Console.WriteLine("Icecream Price : " + ice.Price); Чтение из строк Как известно, строка – набор символов. Т.е. можно запросить непосредственно строковое значение. Для примера можно рассмотреть случай, когда необходимо посчитать количество заглавных букв в строке aString: string aString = "Satheesh Kumar"; Далее строится запрос на чтение строки и нахождение количества заглавных букв. Тип запроса – IEnumerable. IEnumerable query =     from ch in aString     where Char.IsUpper(ch)     select ch; Запрос использует метод Char.IsUpper в условии where для нахождения букв в верхнем регистре из строки. Следующий код отображает количество символов, написанных в верхнем регистре в данной строке. Console.WriteLine("Count = {0}", count); Чтение из текстового файла Файл можно назвать коллекцией независимо от хранящихся в нем данных. Будет создан текстовый файл, содержащий некоторое количество строк. Для получения значений из текстового файла можно использовать запросы LINQ. В примере будет использован текстовый файл, содержащий названия разнообразных сортов мороженого. Для чтения каждой строки текстового файла можно использовать объект StreamReader. Для хранений значений, считанных из текстового файла, создается объект List. После записи в список значений, полученных из текстового файла, можно достаточно просто запросить список, используя LINQ, как было показано выше. В примере ниже рассмотрен код, считывающий строки из текстового файла и загружающий их в список строк. List IcecreamNames = new List();     using( StreamReader sReader = new StreamReader(@"C:Icecreams.txt"))     {         string str;         str = sReader.ReadLine();         while (str != null)         {             IcecreamNames.Add(str);         }     } В следующем коде считывается список строк и возвращаются названия мороженого, отсортированные по убыванию. IEnumerable icecreamQuery =     from name in IcecreamNames     orderby name descending     select name; Для проверки выполнения запроса можно вывести названия мороженого на дисплей, например, так foreach (string nam in icecreamQuery)     {         Console.WriteLine(nam);     } Следующий код выводит названия и проверяет результат работы запроса. foreach (string nam in icecreamQuery)     {         Console.WriteLine(nam);     } Как и коллекции, использованные в примерах выше, библиотека классов .NET может быть использована для чтения метаданных сборки .NET и создавать типы, члены типов, параметры, и другие свойства коллекции. Эти коллекции поддерживают интерфейс IEnumerable, который помогает запрашивать с использованием LINQ. LINQ имеет много стандартных операторов запросов, которые можно использовать для запроса разных объектов, поддерживающих IEnumerable. На этих объектах можно использовать все стандартные операторы запросов, перечисленные ниже. Тип оператора запросов Операторы запроса ограничение Where, OfType проекция Select, SelectMany присоединение Join, GroupJoin Конкатенация Concat Сортировка OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse установка Distinct, Except, Intersect, Union группировка GroupBy Преобразование AsEnumerable, Cast, OfType, ToArray, ToDictionary, ToList, ToLookup Сравнение SequenceEqual Выбор элемента DefaultIfEmpty, ElementAt, ElementAtOrDefault, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault образование Empty, Range, Repeat Количественное определение All, Any, Contains Агрегирование Aggregate, Average, Count, LongCount, Max, Min, Sum Разметка Skip, SkipWhile, Take, Takewhile   Итог В статья были рассмотрены некоторые примеры выполнения запросов с использованием операторов LINQ. LINQ можно использовать на любом объекте, поддерживающем интерфейс IEnumerable. Использование LINQ позволяет избежать использования циклических методов для получения необходимых данных из коллекции. LINQ предоставляет мощные методы для фильтрации, группировки и упорядочения данных. Использование LINQ позволит уменьшить объем исходного кода, тем самым ускорив время разработки. Источник: http://www.codedigest.com/Articles/CSHARP/218_LINQ_to_Objects_in_C_.aspx
Замикання C#

Автор: Редакція ITVDN

Введение Замыкание, как правило, используется функциональными языками программирования, где они связывают функцию с определенным типом параметров, это позволяет дать доступ к переменным, находящимся за пределами границы функции. С использованием делегатов замыкание доступно в С#.   Что такое Замыкание? Чаще всего, лексика замыкания используется в функциональных языках программирования. Замыкание – это специальный тип функции, с помощью которого она ссылается на свободные переменные. Это позволяет замкнутым функциям использовать переменные из внешнего окружения, несмотря на то что они не входят в границы. Когда функция создана, внешние переменные, которыми мы пользуемся, «захватываются», иными словами, они связаны с замкнутой функцией, так что они становятся доступными. Часто это обозначает то, что делаются копии значений переменных, когда инициализируется замыкание. Использование замыкания в С# В С#  замыкание может быть создано с помощью анонимного метода или лямбда-выражения, все зависит от версии .NET framework, на которой вы разрабатываете. Когда вы создаете функцию, переменные, что используются в ней и находятся за областью видимости, скопированы и хранятся в коде с замыканием. Они могут использоваться везде, где вы вызовете оператор delegate. Это дает огромную гибкость при использовании делегатов, но также создает возможность неожиданных багов. К этому мы вернемся позже. А пока, давайте рассмотрим простой пример замыкания. В коде, который ниже, мы создаем переменную «nonLocal» типа integer. Во второй строчке создаем экземпляр делегата «Action», что выводит в сообщение значение переменной типа integer. В конце мы запускаем функцию-делегат, чтобы увидеть сообщения.  int nonLocal = 1; Action closure = delegate { Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; closure();  // 1 + 1 = 2 Мы можем сделать то же самое с лямбда-выражением. В следующем коде мы используем «lambda» для вывода информации, при этом лямбда-выражение имеет одинаковую силу. int nonLocal = 1; Action closure = () => {     Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; closure();  // 1 + 1 = 2 Замыкания и переменные за пределами С помощью анонимных методов или лямбда-выражения примеры выше,при этом получаем те результаты, что вы могли ожидать, так как захват переменных замыканием не очевиден сразу же. Мы можем сделать его более явным, изменяя пределы делегатов. Рассмотрим следующий код. Здесь замыкание находится в классе «program» с переменной «action». В главном методе вызываем метод «SetUpClosure» для инициализации замыкания перед его использованием. Метод «SetUpClosure» очень важен. Вы можете увидеть, что переменная типа integer создана и инициализирована, и только тогда используется замыкание. В конце метода «SetUpClosure» эта переменная типа integer выходит за пределы. Однако, мы все еще вызываем делегат после этого. Скомпилируется и запустится ли этот код правильно? Произошло ли исключение при получении доступа к переменной за пределами? Попробуйте выполнить код. class Program {     static Action _closure;     static void Main(string[] args)     {         SetUpClosure();         _closure();     // 1 + 1 = 2     }     private static void SetUpClosure()     {         int nonLocal = 1;         _closure = () =>         {             Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1);         };     } } Вы могли заметить, что мы получили одинаковый результат как и в оригинальном примере. Это и есть замыкание в действии. Переменная «nonLocal» была охвачена или «замкнута» кодом delegate, в результате чего она остается в нормальных пределах. По сути, переменная будет доступна, пока никаких дальнейших ссылок на делегат не останется. Несмотря на то, что мы увидели замыкание в действии, они не поддерживаются С# и .NET framework. То, что действительно происходит - это работа на заднем фоне компилятора. Когда вы создаете собственные проекты, компилятор генерирует новые, скрытые классы, инкапсулируют нелокальную переменную и описанный код в анонимный метод или лямбда-выражение. Код, описанный в методе, и нелокальная переменная представлены в виде полей. Этот новый метод класса вызовется, когда делегат выполняется. Автоматически сгенерированный класс для нашего простого замыкания - аналогичный приведенному ниже: [CompilerGenerated] private sealed class <>c__DisplayClass1 {     public int nonLocal;     public void b__0()     {         Console.WriteLine("{0} + 1 = {1}", this.nonLocal, this.nonLocal + 1);     } } Замыкание захватывает переменную, а не его значение В некоторых языках программирования определяют значение переменной, которая используется в замыкании. В С# захватываются сами переменные. Это важное отличие, так как мы можем изменять значение переменной за пределами функции. Для иллюстрации рассмотрим следующий код. Здесь мы создаем замыкание, которое выводит наше начальное математическое значение переменной. При создании делегатов значение переменной типа integer равно 1. Но после того замыкания, как мы объявили замыкание, и перед тем, как его вызвали, значение переменной поменялось на 10. int nonLocal = 1; Action closure = delegate {     Console.WriteLine("{0} + 1 = {1}", nonLocal, nonLocal + 1); }; nonLocal = 10; closure(); Так как нелокальная переменная имела значение 1 перед созданием замыкания, вы могли бы ожидать, что результатом вывода будет «1+1=2». На самом деле, на других языках программирования так бы и было. Однако, так как мы изменили значение переменной до вызова функции замыкания, это значение влияет на выполнение функции замыкание. В действительности, вы увидите на дисплее: 10 + 1 = 11 Изменения в нелокальную переменную внутри функции замыкания также передаются в другом направлении. В следующем коде внутри делегата изменяем значение переменной перед тем, как объявленный код выведет ее. Изменения видны во внешней части кода несмотря на то, что происходят они внутри замыкания.  int nonLocal = 1; Action closure = delegate {     nonLocal++; }; closure(); Console.WriteLine(nonLocal);    // 2 Переменная, которую мы изменяем, может привести нас к неожиданным багам в нашем коде. Мы можем продемонстрировать эту проблему в другом примере. На этот раз мы используем замыкание в простом алгоритме: многопоточное или параллельное программирование. Код ниже показывает цикл for, который имеет 5 новых потоков. Каждая пауза короткая, перед выводом значения переменной внутри цикла. Если значение переменной в цикле были захвачены, мы увидим цифры от 1 до 5 показаны в консоли, хотя, возможно, не в правильном порядке. Однако, так как эта переменная находится внутри замыкания и цикл закончится до того, как переменные будут выведены в сообщение, в конечном итоге мы увидим значение 6 для каждого потока.  for(int i = 1; i <= 5; i++) {     new Thread(delegate()     {         Thread.Sleep(100);         Console.Write(i);     }).Start(); } // Outputs "66666" К счастью, такая проблема легко устраняется, когда вы понимаете, что переменные, а не их значения захватываются. Все, что нам нужно сделать, это создать новую переменную для каждого прохождения(итерации) цикла. Это объявление можно записать в теле цикла и давать значение в управляющую переменную. При нормальных обстоятельствах временная переменная будет находится за переделами, когда цикл закончится, но замыкание будет связывать и поддерживать ее. В коде ниже вы можете увидеть 5 примеров «значений», переменные, созданные и им назначенные 5 различных значений, каждая из них привязана к разному потоку. for(int i = 1; i <= 5; i++) {     int value = i;     new Thread(delegate()     {         Thread.Sleep(100);         Console.Write(value);     }).Start(); } // Outputs "12345" Обратите внимание: вывод может меняться в зависимости от порядка, в котором потоки выполняются. Источник: http://www.blackwasp.co.uk/CSharpClosures.aspx
SVG animation

Автор: Дмитро Івченко

Обзор SVG графика может быть анимирована с использованием анимационных тегов. Они были описаны в спецификации Animation SMIL. Рассмотрим эти теги: позволяет анимировать свойства в течение времени. это удобное сокращение, которое полезно для присвоения значений анимационных нечисловых атрибутов и свойств, таких как свойства opacity. который двигает вдоль траектории движения path. которая модифицирует значение цвета отдельных атрибутов или свойств с течением времени. В дополнение к элементам, определенных в SMIL, SVG включает расширения, совместимые с SMIL анимацией спецификации. Эти расширения включают в себя атрибуты, которые расширяют функционал элемента. Расширения SVG включают в себя: - дает возможность анимировать один из SVG атрибутов в течение промежутка времени, например, в качестве атрибута преобразования нового центра фигуры или преобразование фигуры и использование поворота вокруг одной из осей (Х, Y, Z). path(attr) - позволяет анимировать  вдоль определенного пути.    - используется в сочетании с animateMotion элемента для ссылки на траекторию движения, которая должна быть использована в качестве пути для движения. Элемент mpath входит внутрь animateMotion элемента перед закрывающим тегом. keypoints (attr) - задается в качестве атрибута для animateMotion, обеспечивая точный контроль скорости траектории движения анимации. rotate(attr) - используется в качестве атрибута для animateMotion для того, чтобы контролировать поворот относительно оси поворота. SVG анимации могут быть похожи на CSS анимации. Ключевые кадры создаются, объекты движутся. Но они могут сделать нечто, что CSS анимации не делает. Применение SVG Анимации SVG элементы можно стилизовать и анимировать и с помощью CSS. В принципе, любое преобразование или анимации перехода, которые могут быть применены к HTML элементу, также могут быть применены к SVG. Но существуют некоторые SVG свойства, которые не могут быть сделаны через CSS. Векторная версия путь, например, поставляется с набором данных path, который определяет траекторию этому пути. Эти данные могут быть изменены и анимированных через SMIL, но не CSS. Это потому, что SVG элементы описаны набором атрибутов, известных как SVG атрибуты представления. Если вы предпочитаете использовать JavaScript, я рекомендую использовать snap.svg, который описан как "в JQuery в SVG". Вот коллекция примеров. http://snapsvg.io/demos/ Если вы предпочитаете декларативный подход анимации, вы можете применять элементы SVG анимации, о которых я расскажу. Еще одно преимущество SMIL над JS анимацией в том, что JS анимации не работают, когда SVG встроен в качестве IMG или используется в качестве фона изображения в CSS. SMIL анимации работают в обоих случаях. Это большое преимущество, на мой взгляд. Поддержка браузеров Поддержка браузеров для SMIL анимации довольно приличная. Они воспроизводятся во всех браузерах, кроме IE. Подробный обзор поддержки браузеров вы можете посмотреть в таблице совместимости на caniuseit. Если вам нужно обеспечить альтернативный вариант для SMIL анимации, вы можете проверить поддержки браузера на лету, используя Modernizr. Если SMIL не поддерживается, вы можете предоставить какой-то запасной вариант (анимации JavaScript, например). Анимация атрибутов элемента из одного значения к другому в течение произвольного времени с указанием конечного состояния: from, by, to, dur и fill. Давайте рассмотрим с перемещением круга из одного положения в новое. Это можно сделать, изменив значение его атрибута сх (который определяет х - положение его центра). Мы собираемся использовать элемент, чтобы сделать это. Атрибуты, которым устанавливают числовые значения и цвета, как правило, анимированные с помощью . Для получения списка атрибутов, которые могут быть анимированными, обратитесь к этой таблице: http://www.w3.org/TR/SVG2/animate.html#AnimationAttributesAndProperties Чтобы изменить значение на другое в течение времени используются from, by, to, dur и fill. В дополнение к этому, вы также хотите указать, когда анимация должна начинаться с атрибутом начала. В приведенном примере, я определил круг, а затем вызываю анимацию на этом круге. Центр окружности перемещается из исходного положения - 500 единиц, до 1750 единиц вдоль оси х. Начальное значение установлено на кнопку мыши. Это означает, что круг будет двигаться, когда она нажата. Вы можете установить это значение к значению времени, а также. Например, начинают = "0s" начнет анимацию, как только страница загружена. Вы можете задержать анимацию, установив положительное значение времени. Например, начать = "6s" запустит анимацию через шесть секунды после нагрузки. Атрибут Dur похож на анимации-импульса в CSS. from - to атрибуты похожи на from to ключевых кадров в keyframe блока анимации в CSS: Повторяющиеся анимации с Repeat-Count Когда вы хотите воспроизвести анимацию несколько раз, вы можете сделать это с использованием атрибута RepeatCount. Можно указать, сколько раз вы хотите повторить или использовать ключевое слово, чтобы он без конца повторять. Так что, если мы должны были повторить анимацию вида круга в течение двух раз, код будет выглядеть так: Управление значениями ключевых кадров анимации: keyTimes и values. В CSS, мы можем задать значения, которые мы хотим, чтобы взять в определенные рамки во время анимации. 0%, 40 % , 80 % и 100% являются кадрами анимации. Анимация вдоль определенных путей: Хорошие примеры таких анимаций можно посмотреть здесь http://codepen.io/mileselam/pen/kprKm http://codepen.io/rossfenrick/pen/gpzJzz http://codepen.io/tmrDevelops/pen/yyveKv Так же более подробный пример есть на хабре http://habrahabr.ru/post/207908/ Функция прохода анимации Еще один важный элемент — это функция по которой будет проходить анимация. Среди всем известных функций анимации мы знаем ease, ease-in, ease-out, linear. Но если Вы хотите создать свою функцию прохождения анимации, то вам сюда http://cubic-bezier.com/ И напоследок лучший пример, от которого просто невозможно оторвать глаз http://codepen.io/thiennhat/pen/BNByzJ?editors=001 Пробуйте и у вас все получится!
Властивість CSS: z-index

Автор: Редакція ITVDN

Введение В данной статье с помощью некоторых примеров мы научим Вас использовать свойство CSS: Z-index. Z-index используется для стабилизации порядка элементов, которые перекрываются. Z-Index является важным свойством CSS. Оно указывает на уровень элемента в стеке. Свойство z-index регулирует вертикальный порядок перекрытия элементов, а сам z-index определяет, какой элемент будет располагаться выше остальных. Элемент с большим указателем порядка стека всегда будет располагаться выше элемента более низкого порядка. А элемент с самым большим индексом перекроет остальные элементы. «Порядок стека» обращается к позиции элемента по оси Z. Чем выше значение z-индекса, тем ближе элемент будет располагаться к верхней части порядка наложения. Синтаксис Z-index  z-index: auto| number | initial | inherit;  Z-index: auto Это настройка по умолчанию, что приписывает одинаковое значение и элементу, и родителю. Если значение не определено для родителя, то оно равняется нулю (0); Z-index: integer number Z-index: 1 Z-index: 2 Z-index: 3 Z-index: negative number Z-index: -1 Z-index: inherit Принимает такое же определенное значение, как свойство элемента родителя. Ниже предоставлен HTML код, который будем использовать.  <!DOCTYPE html> <html> <head>     <title>Z-Index tutorialtitle> head> <body>     <div id="one">Onediv>     <div id="two">Twodiv>     <div id="Three">Threediv>     <div id="Four">Fourdiv>     <div id="Five">Fivediv> body> html> Далее мы используем CSS код для установки внешнего вида всем элементам HTML, что использовались ранее. #one {     border: solid 5 px silver;     background-color: Aqua;     position: absolute;     z-index: 1;     opacity: 0.5;     height: 100 px;     width: 100 px; } #two {     border: solid 5 px silver;     background-color: Green Yellow;     position: absolute;     top: 30 px;     left: 35 px;     z-index: 2;     opacity: 0.5;     height: 100 px;     width: 100 px; } #Three {     border: solid 5 px silver;     background-color: Coral;     position: absolute;     top: 60 px;     left: 60 px;     opacity: 0.5;     z-index: 3;     height: 100 px;     width: 100 px; } #Four {     border: solid 5 px silver;     background-color: Yellow;     position: absolute;     top: 90 px;     left: 90 px;     opacity: 0.5;     z-index: 4;     height: 100 px;     width: 100 px; } #Five {     border: solid 5 px silver;     background-color: MediumSpringGreen;     position: absolute;     top: 120 px;     left: 120 px;     opacity: 0.5;     z-index: 5;     height: 100 px;     width: 100 px; } Полный код <!DOCTYPE html> <html> <head>     <title>Z-Index tutorialtitle>     <style>         #one {             border: solid 5px silver;             background-color: Aqua;             position: absolute;             z-index: 1;             opacity: 0.5;             height: 100px;             width: 100px;         }         #two {             border: solid 5px silver;             background-color: Green Yellow;             position: absolute;             top: 30px;             left: 35px;             z-index: 2;             opacity: 0.5;             height: 100px;             width: 100px;         }         #Three {             border: solid 5px silver;             background-color: Coral;             position: absolute;             top: 60px;             left: 60px;             opacity: 0.5;             z-index: 3;             height: 100px;             width: 100px;         }         #Four {             border: solid 5px silver;             background-color: Yellow;             position: absolute;             top: 90px;             left: 90px;             opacity: 0.5;             z-index: 4;             height: 100px;             width: 100px;         }         #Five {             border: solid 5px silver;             background-color: MediumSpringGreen;             position: absolute;             top: 120px;             left: 120px;             opacity: 0.5;             z-index: 5;             height: 100px;             width: 100px;         }     style> head> <body>     <div id="one">Onediv>     <div id="two">Twodiv>     <div id="Three">Threediv>     <div id="Four">Fourdiv>     <div id="Five">Fivediv> body> html> Наш результат: Заключение Надеемся, что данная статья Вам понравилась. Она будет полезной для новичков в HTML и CSS. Источник: http://www.c-sharpcorner.com/UploadFile/88d8c0/z-index-property-in-css/
Створення програми Microsoft Band за допомогою Web Tiles

Автор: Редакція ITVDN

Введение Устройства, которые можно одевать, сейчас очень распространены. Они уникальные, модные, продуктивные и позволяют оставаться на связи в нашем цифровом образе жизни. Однако, надеваемые гаджеты также могут быть подрывными в мобильном пространстве. Пока разработчики увлечены переходом на кросс-платформенную разработку родных или гибридных мобильных приложений, прибывают носимые устройства от Apple, Microsoft и Google, каждая из которых обслуживает свою соответствующую платформу и прокладывает собственный путь развития как дополнение к уникальным принципам UX. Если Вы  поклонник Microsoft Band, то у Вас есть основания для радости. И не только потому, что Band – одно из немногих носимых устройств, которые работают кросс-платформенно с любым Вашим телефоном. Также очень просто добавлять пользовательские данные на запястье в качестве Band-приложения. Все, что для этого потребуется – стандартный терминал данных и немного веб-навыков.  В этой статье мы покажем, как добавлять веб-данные в Ваше устройство Band с помощью Web Tiles. Перспектива Поскольку потребителям нравятся такие устройства, возникает новая экосистема, которую разработчикам надо поддерживать. Конечно, носимые устройства забавные, очень личные и предоставляют возможности для завлечения пользовательского опыта, но разработчикам теперь приходится работать с исключительно маленькими экранами, пересматривать содержание приложений и пользовательский интерфейс, чтобы оставаться в первых рядах, учитывая переход мобильных приложений на кросс-платформу. Еще одна сложность при разработке носимых устройств исходит из того, что такие устройства неразрывно связаны с соответствующей принимающей мобильной операционной системой. В конце концов, такая разработка часто представляет собой разработку нативного приложения, и разработчик должен знать родной SDK, паттерны программирования и цель, чтобы получить нужный опыт взаимодействия(User eXperience, UX). Мы можем наблюдать, как Apple сейчас пытается дистанциировать Apple Watch от родительского iPhone в следующем выпуске Watch OS 2. Пока что нам все еще приходится обращаться к родительской системе, но обнадеживает, что у носимых гаджетов есть собственная операционная система и приложения могут быть самодостаточными, а не пребывать в зависимости от соответствующей мобильной платформы. MICROSOFT BAND Microsoft Band представляет собой нечто среднее между фитнес-устройством и умными часами. Устройство Band заполнено датчиками -  оптическим датчиком сердечного ритма, акселерометром, GPS, датчиком освещенности, температуры, ультрафиолетовым сенсором, сенсором емкости, микрофоном и гальваническим датчиком отклика на касание. Однако, несмотря на преимущества, которыми располагают все эти сенсоры, строительство приложений сильно усложняется. Разработчик SDK для Microsoft Band очень мощный, предоставляет разработчикам полный доступ к API canvas, чтобы делать убедительные приложения для Band. SDK можно применять для создания персонализированных, интерактивных фрагментов, используя пользовательские макеты, что вмещают текст, иконки, кнопки и штрих-коды. Тем не менее, Вам надо построить собственные мобильные приложения для каждой платформы, чтобы в дальнейшем построить сопутствующее устройство Band. Несмотря на то, что существует фреймворк Xamarin, позволяющий разрабатывать кросс-платформенные приложения, это далеко непросто для разработчиков. Последние обновления Все изменилось с последними обновлениями для Microsoft Band  и платформы разработки Health. Самой интересной особенностью является новая поддержка для Web Tiles. Вам больше не нужны нативные мобильные приложения, можно просто повторно использовать веб-данные. Каждый пользователь Band непременно использует приложение Microsoft Health – что изначально есть на каждой мобильной платформе. Тогда почему бы не усилить повсеместность приложения Health и интернет-подключения Band, чтобы принести в устройство облачные данные?  Web Tiles делают доставку информации к пользователям Band максимально просто и практически из любого интернет-источника. Также новым есть предварительный просмотр облачного Microsoft Health API, который предлагает RESTful API для повышения использования приложения в режиме реального времени, для фитнес-пользователей и отслеживания здоровья. Автоматизация Web Tiles Подача данных Предусматривая веб-фрагменты для Band, в первую очередь, Вам надо решить, какие данные надо выводить. Соответственно, это должны быть короткие порции информации для Ваших Band-пользователей. Вы должны выбрать правильный контент – действительно значимую информацию для беглого просмотра на пользовательском запястье. Web Tiles могут получить доступ практически к любому интернет-источнику данных , пока данные поступают через конечные точки RESTful и доступны в стандартных форматах как ATOM/JSON. Пока нет нехватки в таких конечных точках. Сейчас в свободном доступе находятся данные из Telerik Developer Network (TDN). Если Вы находитесь на сайте TDN, можете просто нажать на ссылку RSS или просто перейти к http://developer.telerik.com/feed/. Строка новостей RSS вмещает в себя статьи из TDN. Давайте рассмотрим, как создать список этих последних статей на Band-устройстве, используя Web Tiles. Инструмент разработки Самый простой способ построить Web Tiles - это использовать инструмент разработки Microsoft Band Web Tile, просто нажмите большую кнопку Get Started. Это простой 5-шаговый инструмент разработки с веб-интерфейсом. На самом деле, Вам даже не нужно быть разработчиком, чтобы им пользоваться. Мастер проведет Вас через все этапы, необходимые для создания Band Web Tile. Ниже представим разработку Web Tile для статей TDN. 1. Выберите из представленного набора стандартных макетов для отображения данных, каким образом пользователь будет запускать свой Tile. 2. Укажите инструмент разработки Web Tile на свое устройство подачи данных. Обратите внимание на использование RSS, как показано ниже. 3. Дальше мы преобразим некоторые данные, в основном, через перетягивание. В соответствии с выбранным макетом Вы получите несколько заполнителей для отображения данных. Инструмент будет влиять на подачу данных, которые Вы указали. Это для того, чтобы дать нам представление о данных, которые будут отстранены от облачного источника данных. Вам всего-то нужно переместить повторяющиеся элементы данных в динамические заполнители с помощью цветового кодирования – и все подключено. Также от устройства подачи можно задавать статический контент поверх динамического, если Вам захочется. 4. Затем, настройте цветовую схему для Web Tile и обеспечьте некоторую идентифицирующую информацию для пользователя. Обратите внимание на примерный показ того, как будут выглядеть ваши данные в Band. Здесь же Вы получите нужную иконку для представления вашего Web Tile – она должна иметь прозрачный фон, соответствовать расширению 46x46px и рекомендациям пользовательского интерфейса UI для Band. 5. Последний шаг мастера настроек позволяет скачать предварительную версию Web Tile на компьютер. В итоге, Вы получите файл с расширением .webtile  – просто архивированный файл со всеми заданными Вами конфигурациями. Источник: http://developer.telerik.com/featured/create-a-microsoft-band-app-with-web-tiles/
Формат даних та підрахунок віку у JavaScript

Автор: Редакція ITVDN

Введение Как веб-разработчик, Вы можете знать, что форматирование данных на серверном языке – не очень сложная задача. Достаточно базового понимания языка и того, что Вам нужно для реализации, и вот – у Вас есть хорошо отформатированный объект даты и времени. Например, следующий код С# является хорошо отформатированным и может предоставить нужный Вам объект даты и времени. var dateOfBirth = new DateTime(1995, 08, 29); // My date of birth  var formatted = dateOfBirth.ToString("MMMM dd, yyyy"); // Would hold: August 29, 1995   В выше написанном коде мы предусмотрели формат данных, который нам нужен, и код, что обеспечит ожидаемый результат. Впрочем, делать это в JavaScript весьма трудно, потому как в JavaScript нет переопределенного метода ToString, который может преобразовать объект даты и времени в должным образом форматированное значение. Тем не менее, объекты Date в JavaScript используют методы, с помощью которых можно извлечь значения месяца, дня или года. Мы будем их использовать, чтобы сгенерировать форматированный string для объекта date. Также заметим, что в JavaScript объект даты и времени является числом, которое отображается как количество миллисекунд от 1-го января 1970 г. Поэтому, чтобы не писать свой собственный код для подсчета месяцев и дат, можете использовать встроенные функции getMonth, getDate и др. чтобы получить нужные значения. В нашей статье мы покажем Вам, как написать код и как правильно форматировать запись string в объект даты и времени. Объект даты и времени в Javascript Объект даты и времени (Date) в JavaScript намного компактнее, чем в других языках программирования. Он не обеспечивает множество функций и особенностей. Это просто конструктор, который принимает число миллисекунд или значение строки, что представляет объект даты и времени в пределах от 1 января 1970 года до сегодняшнего дня (каким бы он ни был). Вы легко можете создать его экземпляр, используя следующий код var date = Date.now(); // current date time  // OR  var date = new Date(); // new instance; default  // OR  var date = new Date('string-notation-of-datetime'); // Any date time upto 1 January 1970 from Now.   Теперь давайте поработаем с данным исходным кодом и посмотрим, что JavaScript может нам предложить. Написание веб-приложения В Вашем HTML Вы можете определить поля ввода от пользователя и установить диапазон их типов, что позволило бы пользователю вводить значение любого из этих типов. В нашей статье мы будем использовать тип date. Используем следующую HTML-разметку Примечание: мы использовали Bootstrap в качестве стиля. <input type="date" class="form-control"/> Контроль после рендеринга Это то, что у нас есть для макета, а теперь давайте обратимся ко входным данным пользователей. Мы должны найти указанную пользователем строку даты и времени, а также рассчитать по ней возраст. var dateValue = new Date($('input').val()); // Get the value    // Now comes the stringification... Following code does that.  var date = getMonth(dateValue.getMonth()) + " " + dateValue.getDate() + ", " + dateValue.getFullYear(); В JavaScript методы getDate, getMonth возвращают номер объекта. Вместо использования номера в качестве даты создадим другую функцию, которая возвращает месяц из нашего целого значения. Примечание: date.getMonth() при возврате значения начинает отсчет от 0. function getMonth(index) { // Pass the index as parameter      switch (index) { // Switch on index          case 0:             return "January";             break;         case 1:             return "February";             break;         case 2:             return "March";             break;         case 3:             return "April";             break;         case 4:             return "May";             break;         case 5:             return "June";             break;         case 6:             return "July";             break;         case 7:             return "August";             break;         case 8:             return "September";             break;         case 9:             return "October";             break;         case 10:             return "November";             break;         case 11:             return "December";             break;         default: // Wouldn't get called usually because range is 0-11              "Invalid number: " + index;             break;     } } Описанная выше функция возвращает строку для месяца. Поэтому, вышеуказанный код сможет вернуть данные в строковом представлении.Что касается функции расчета возраста, то реализовать ее не так просто, как в С# или других языках. Вам надо вручную отбросить значения объекта даты и времени в миллисекундах с 1970 года, учитывая вычисление результата от даты рождения до текущего времени. Запутались? Давайте проверим наш код и упростим формулировку. var age = Math.abs(              new Date(                    Date.now() - dateValue // 1. Get the difference as new Date object                ).getUTCFullYear() - 1970 // 2. Calculate the years           ); // 3. Get the value   Мы разделили процесс на три этапа: Прежде всего получим значение после отрицания даты рождения от текущей даты. Это будет основой для нашего алгоритма возраста. Дальше найдем UTC-значение года от значения, что мы получили через отрицание, и вычтем от него 1970. Теперь получим абсолютное значение от шага 2. Теперь функция будет вмещать значение возраста для введенных пользователем данных. Запустим вышеуказанную функцию и получим HTML, для примера HTML-разметка с указанием даты в отформатированной строке и возраста пользователя. Заключение Теперь Вы знаете как можно выбрать введенные пользователем данные и рассчитать возраст пользователя с помощью JavaScript, а также как показать его в строковом представлении для удобства чтения. Источник: http://www.c-sharpcorner.com/UploadFile/201fc1/calculating-and-formatting-date-in-javascript/
10 порад для написання JavaScript без JQuery

Автор: Редакція ITVDN

Введение JQuery - огромная библиотека. Она пришла приблизительно в то время, когда IE6 был браузером номер один. Тогда было много специфических моментов и разногласий, что делало процесс разработки утомительным и JQuery был идеальным инструментом для написания кроссбраузерного кода. С тех пор, однако, веб-браузеры намного усовершенствовались. Вы можете с удобством использовать все возможности, предоставляемые ES5, и имеете в полном распоряжении огромную API-библиотеку HTML5, которая делает работу с DOM-элементами намного приятнее. Разработчики теперь могут выбирать, что же можно оставлять из JQuery для некоторых проектов, продолжая сохранять свою производительность. Не поймите неправильно – JQuery по-прежнему отличная библиотека и чем чаще вы будете использовать ее, тем лучше. Тем не менее, для небольших проектов, например, для простых страниц с ограниченным JS взаимодействием, расширениями браузеров и мобильных сайтов, вы можете использовать vanlla JS.  Вот 10 советов, которые помогут в вашей деятельности. 1. Прослушивание на готовность документа (Document Ready) Первое, что вы делаете, когда пишете JQuery, это упаковывание своего кода в вызов $(document).ready()  для того, чтобы определить готовность DOM к манипуляциям. Без JQuery у вас есть событие DOMContentLoaded. Вот как оно используется. 2. Выбор элементов Давным-давно Вы могли только выбирать элементы по ID, классу и имени тега, а JQuery с ее умными CSS-селекторами выступала своеобразным спасателем. Браузеры исправили это и представили две важные API - querySelector и querySelectorAll. 3. Установка и удаление слушателей событий Прослушивание событий - фундаментальная часть построения веб-приложения. Принято было использовать две основные стороны, которые отличались тем, каким способом все было сделано - IE и остальное. Но сегодня мы просто используем addEventListener. 4. Манипулирование классами и свойствами Манипулирование именами классов элементов без JQuery было очень неудобно использовать. Но проблема была решена благодаря свойству ClassList. И если нужно управление атрибутами, Вам нужен SetAttribute. 5. Получение и установка содержимого элементов JQuery имеет удобный текст и html ( )методы. Вместо их можно использовать свойства textContent и innerHTML, которые были у нас в течение очень долгого времени. 6. Установка и удаление элементов Хотя JQuery и делает все намного проще, добавление и удаление DOM-элементов невозможно без простого JavaScript. Здесь показано, как добавлять, удалять и заменять любые элементы, какие Вы только захотите. 7. Прохождение по DOM дереву Любой настоящий JS-ниндзя знает, что есть много возможностей, скрытых в DOM. По сравнению с JQuery простые интерфейсы DOM предлагают ограниченную функциональность для выбора нескольких уровней. И, тем не менее, есть множество вещей, которые Вы можете делать,  путешествуя по DOM - дереву. 8. Обработка массивов Некоторые из утилитных методов, которые предоставляет JQuery, доступны со стандартом ES5. При переборе массивов можно использовать forEach и map вместо их JQuery аналогов - each() и map(). Просто будьте осторожны при различиях в аргументах и значениях по умолчанию в обратных вызовах. 9. Animations Методы анимации JQuery самым лучшим образом подходят ко всему, что Вы бы хотели «оживить» и, если нужны сложные анимации из скриптов в приложении, Вы должны по-прежнему иметь дело с ней. Но благодаря всем чудесам CSS3, некоторые простые случаи можно обработать с помощью легкой библиотеки Animate.css, которая позволяет запускать анимацию, добавляя или удаляя имена классов элементов. 10. AJAX Ajax – это еще одна технология, которая используется при кросс-браузерном беспорядке. Хорошая новость - теперь можно использовать один и тот же код везде. Плохая новость - по-прежнему громоздко создавать экземпляры и отправлять AJAX-запросы с XMLHttpRequest, так что лучше предоставить это библиотеке. Но Вы не должны подключать всю JQuery только для этого. Вы можете использовать одну из самых многочисленных и легких библиотек, которые доступны. Вот пример построения запроса AJAX напрямую, и с помощью небольшой библиотеки запросов. Выводы Стремление к минимальному, нулевому количеству наворотов на веб-странице - достойная цель, что окупит себя быстрой загрузкой и лучшим пользовательским опытом. Но будьте осторожны - никто не выиграет, если Вы будете изобретать велосипед, который уже используется в JQuery. Не жертвуйте хорошей практикой разработки только для того, чтобы сократить количество кода. Но есть множество мест, где на сегодня советы вполне применимы. Попробуйте следовать ванили в следующий раз, это может быть все, что вам нужно! Источник: http://tutorialzine.com/2014/06/10-tips-for-writing-javascript-without-jquery/
Узагальнені класи С#

Автор: Редакція ITVDN

Введение Обобщенные классы в С# представляют параметры типа. Они имеют 5 параметров. Обощенный класс становится частью обусловленного класса сам по себе. Класс типа Т приведен в примере ниже. Буква Т определяет тип, который в основном базируется на зоне абонента. Запустите программу Visual Studio. Выберите тип проекта и строчку console application. Шаг 1 Нажмите на ярлык файла -> Новое -> Программа. Шаг 2 Выберите строчку Visual C# в левой части окна. Кликните Console Application в правом окне. Назовите программу «GenericClass». Задайте, где Вы хотите сохранить программу. Нажмите Ok. Шаг 3 Введите следующий код в дополнение: public class Myclass {        public void Compareme(T v1, T v2)        {              if (v1.Equals(v2))              {                     Console.Write("The value is matching");              }              else              {                     Console.Write("The value is not matching");              }        }           } class Program {        static void Main(string[] args)        {              Myclass objmyint = new Myclass();              objmyint.Compareme("Amit", "Amit");              Console.ReadLine();        } } После введения кода, Вы получите такие исходные данные.  Измените строчку на что-либо другое, проверьте исходные данные. В примере создан второй строчный параметр «amit». public class Myclass {        public void Compareme(T v1, T v2)        {              if (v1.Equals(v2))              {                     Console.Write("The value is matching");              }              else              {                     Console.Write("The value is not matching");              }        } } class Program {        static void Main(string[] args)        {              Myclass objmyint = new Myclass();              objmyint.Compareme("Amit", "amit");              Console.ReadLine();        } } Посмотрите на результат. Источник: http://www.c-sharpcorner.com/UploadFile/d1028b/generic-class-in-C-Sharp/
Створення Super Meat Boy на Unity

Автор: Антон Даніелян

Введение Данная статья ориентирована на тех, у кого уже есть небольшой опыт работы с Unity. В первую очередь мы рассмотрим воссоздание механики управления главного героя игры Super Meat Boy. Также узнаем, как построить сцену, имея скриншот уровня оригинальной игры. Все материалы, использованные в данном примере, принадлежат разработчикам оригинальной игры.  Для начала стоит сказать пару слов о фоновых картинках для уровней. Чтоб не создавать весь уровень из отдельных элементов, редактируем найденные на просторах интернета скриншоты, на которых вырезаем главного героя, таймер с левой части экрана и следы крови. Теперь у нас есть подготовленный фон. Элементы Уровня Поверхности, по которым можно двигаться, задаем с помощью компонента Polygon Collider 2D. Места, где игрок может умереть (выпасть из поля зрения камеры или попасть на режущую пилу) обозначаем тегом killzone. К ним крепим данный скрипт: void OnTriggerEnter2D(Collider2D other)     {         if (coll.tag =="killzone")         {            Application.LoadLevel(Application.loadedLevelName);         }           } При прикосновении коллайдер игрока вызывает срабатывание скрипта и подгружает этот же уровень, то есть происходит рестарт. Аналогично работает и загрузка следующего уровня, единственным отличием является передаваемое методу Application.LoadLevel() текстовое значение с названием уровня. Этот скрипт прикрепляем к объекту endTarget. Следы крови размещаем на все потенциально доступные игроку поверхности (кроме уровня песочницы, где они находятся на каждой из 4 сторон блока). Они состоят из отключенного по умолчанию компонента Sprite Renderer, компонента Box Collider 2D с активированным значением IsTrigger и скрипта, который собственно и включает Sprite Renderer при коллизии с игроком.  SpriteRenderer sR;       void Start()     {         sR = transform.GetComponent<SpriteRenderer>();     }       void OnTriggerEnter2D(Collider2D coll)     {         if (coll.tag =="Player")         {            sR.enabled = true;         }             } Получаем компонент Sprite Renderer во время выполнения при помощи метода GetComponent(), вызываемого на данном объекте. Если тег прикасающегося коллайдера равен "Player", то включаем Sprite Renderer, который отображает картинку крови на уровне.  Создание персонажа Внешний вид персонажа В оригинальной игре мит-бой тщательно анимирован и имеет большое количество визуальных эффектов, большинство из которых мы воссоздавать не будем по причине нецелесообразности. Вместо анимации будем использовать простую подмену спрайтов при смене состояния игрока. Для главного персонажа нам понадобятся  компоненты Rigid Body 2D, Sprite Renderer, Box Collier 2D, Circle Collider 2D и скрипт управления, который мы рассмотрим чуть ниже. В инспекторе на компоненте Rigid Body 2D ставим галочку на Fixed Angle, в Circle Collider 2D на IsTrigger. Этим мы зафиксировали персонажа в одном положении и указали, что Circle Collider 2D выполняет функцию триггера. Радиус окружности коллайдера должен быть таким, что немного выходит за рамки квадратного коллайдера. Он является триггером появления следов крови на уровне. Объявление переменных Для корректной имитации поведения нам понадобятся переменные для скорости ходьбы, бега, прыжка, а также ускорения в воздухе и на земле.     public float jumpForce = 50f;     public float speed = 10;     public float speedMultiplier = 4f;     public float acceleration = 5f;     public float airAcceleration = 2f; Для данных переменных экспериментальным путем были подобраны значения, которые больше всего напоминают поведение оригинала. Также нам понадобятся переменные для контроля вида персонажа и собственно его физика. Они позже будут инициализированы уже знакомым нам способом во время выполнения. SpriteRenderer spriteRender; Rigidbody2D rBody; Для правильного отображения разных состояний мит-боя будем использовать несколько картинок, поэтому берем переменные типа Sprite. //спрайты разных состояний     public Sprite jumpSprite;     public Sprite RunSprite;     public Sprite IdleSprite;     public Sprite SlidingOnAWallSprite; Данные спрайты будем инициализировать не в рантайме, а в редакторе, где проводим им ссылку на картинку для каждого состояния. И напоследок еще понадобятся данные о высоте, толщине персонажа и состояние прыжка.   float playerWidth;     float playerHeight;     //флаг состояния прыжка     bool ableToJump = true; Управление главным героем После объявления всех нужных нам переменных, переходим к реализации. Зарезервированный метод Awake() отработает сразу поле загрузки уровня, поэтому в нем и инициализируем переменные толщины, высоты и другие.  void Awake()     {         //инициализация этих переменных произойдет сразу после запуска сцены         playerWidth = GetComponent<BoxCollider2D>().bounds.extents.x + 0.05f;         playerHeight = GetComponent<BoxCollider2D>().bounds.extents.y + 0.05f;         rBody = transform.GetComponent<Rigidbody2D>();         spriteRender = transform.GetComponent<SpriteRenderer>();     } Переменные playerHeigth и palyerWidth будут полезны при определении, находится ли игрок на земле. К ним прибавляем небольшой зазор, который не даст лучу от персонажа заметить его же коллайдер. Метод IsOnGround() возвращает true в случае, если хотя бы один из созданных лучей касается коллайдера. Для удобства создаем два луча – с левой нижней части коллайдера персонажа и правой соответственно. При создании отнимаем высоту, учитывая вертикальный и горизонтальный зазоры. Этот способ позволит уйти от многих проблем при прыжках возле стен. public bool IsOnGround()     {         //создаем луч длинной 0.01 справа с направлением вниз         bool rightBottom = Physics2D.Raycast(             new Vector2(transform.position.x + playerWidth - 0.055f,             transform.position.y -playerHeight), -Vector2.up, 0.01f);         //аналогичный луч слева         bool leftBottom = Physics2D.Raycast(               new Vector2(transform.position.x - playerWidth + 0.055f,               transform.position.y - playerHeight),-Vector2.up, 0.01f);         return (rightBottom || leftBottom) ? true : false; } Метод Run() отвечает за движение игрока по горизонтали. Параметр int directionX отвечает за направление, если число позитивное, то двигаемся вправо, негативное – влево соответственно. Если нажат LShift, то учитывается умножитель ускорения. Если игрок находится в воздухе, то множим на переменную ускорения в воздухе.  private void Run(bool onGround, int directionX)     {         rBody.AddForce(new Vector2((directionX * speed - rBody.velocity.x) *             (Input.GetKey(KeyCode.LeftShift) ? speedMultiplier : 1f) *            (onGround ? acceleration : airAcceleration), 0));     } Метод JumpNearWall() отвечает за прыжок персонажа возле стены. Аналогично методу Run(), он принимает параметр int directionX. private void JumpNearWall(int directionX)     {         //убираем инерцию         rBody.velocity = Vector2.zero;         rBody.AddForce(new Vector2(directionX *             jumpForce * airAcceleration * 3,             jumpForce * airAcceleration * 5));         StartCoroutine(JumpCoolDown());     } В конце тела этого метода вызываем корутин, который будет убирать возможность прыгать суммарно на 0.1 секунд. IEnumerator JumpCoolDown()     {         yield return new WaitForSeconds(0.05f);         ableToJump = false;         yield return new WaitForSeconds(0.05f);         ableToJump = true;     } Метод FlipPlayer() меняет направление используемого спрайта игрока. void FlipPlayer(bool toLeft)     {         //если повернут направо, а нужно налево         if ((transform.localScale.x < 0 && toLeft) ||         //если повернут налево, а нужно направо             (transform.localScale.x > 0 && !toLeft))         {             transform.localScale = new Vector3(transform.localScale.x * -1f,                 transform.localScale.y, transform.localScale.z);         }     } Метод FixedUpdate() является зарезервированным и вызывается независимо от количества отработанных кадров. Для начала получаем значение, касается ли персонаж пола и стен слева и справа.  bool onGround = IsOnGround();         bool nearLwall = Physics2D.Raycast(             new Vector2(transform.position.x - playerWidth, transform.position.y),             -Vector2.right, 0.01f);         bool nearRwall = Physics2D.Raycast(             new Vector2(transform.position.x + playerWidth, transform.position.y),             Vector2.right, 0.01f); Присваиваем спрайт по умолчанию – спрайт безделья.  spriteRender.sprite = IdleSprite; Теперь считываем нажатие кнопок управления. if (Input.GetKey(KeyCode.RightArrow))         {             //двигаем персонажа в позитивном направлении по оси Х             if (!nearRwall) Run(onGround, 1);             //присваиваем новый спрайт и меняем его направление             spriteRender.sprite = RunSprite;             FlipPlayer(false);         }         else if (Input.GetKey(KeyCode.LeftArrow))         {             //двигаем персонажа в негативном направлении по оси Х             if (!nearLwall) Run(onGround, -1);             spriteRender.sprite = RunSprite;             FlipPlayer(true);         } Если персонаж находится на поверхности и нажат пробел, то выполняем прыжок и активируем таймер до следующего прыжка. if (Input.GetKeyDown(KeyCode.Space) && onGround && ableToJump)         {             //выполняем "прыжок с земли"             rBody.AddForce(new Vector2(0, jumpForce * acceleration* 1.7f));             spriteRender.sprite = jumpSprite;             //таймер до следующего прыжка             StartCoroutine(JumpCoolDown());         } В противном случае разделяем поведение для прыжка возле левой и правой стенки.             if (Input.GetKeyDown(KeyCode.Space) && nearLwall && ableToJump)             {                 //прыжок от стены вправо                 JumpNearWall(1);             }             if (Input.GetKeyDown(KeyCode.Space) && nearRwall && ableToJump)             {                 //прыжок от стены влево                 JumpNearWall(-1);             } Если игрок возле стенки, меняем спрайт и уменьшим скорость вертикального движения при прикосновении к стене после прыжка. Поворачиваем спрайт в нужном направлении и скрипт управления готов. spriteRender.sprite = SlidingOnAWallSprite;                 rBody.velocity = new Vector2(rBody.velocity.x,                     (rBody.velocity.y > 9.0f) ? rBody.velocity.y * 0.6f : rBody.velocity.y);                              if (nearLwall) FlipPlayer(true);                 else FlipPlayer(false); Теперь осталось опробовать все на практике. К данной статье прикреплен проект с уровнем «песочница», который можно изменить, как угодно добавив или убрав элементы. 
Об'єктно-орієнтоване програмування C# у деталях

Автор: Редакція ITVDN

Введение Большое количество статей посвящены C # OOП, но в данной C # OOП объясняется на понятных примерах. 1. Класс Класс - это макет. Что такое макет? Макет – это схематический чертеж плана будущего проекта. Например, если Вы планируете строить новый дом, инженер объяснит план его конструирования, демонстрируя макет, как на рисунке ниже. После этого инженер на основе макета начнет строительство дома. Как и макет, у класса есть чертеж программы. Используя класс, можно создать собственный метод, указать значения переменных, а через объекты получить доступ к методам классов и их переменным значениям. Класс должен иметь значения переменных, методы и объекты. ООП проще объяснить на примерах из жизни. Представьте дом в качестве примера для класса. В доме есть комнаты: гостиная, спальня, кухня - и техника, например, телевизор и холодильник. Владелец дома может пользоваться всеми комнатами и приспособлениями своего дома. То же можно сказать и о классе с группой методов и значений переменных. Комнаты с техникой – пример методов и значений переменных. Чтобы использовать класс, методы или значения переменных, используются объекты. Объекты являются примерами класса. Дом без комнат и техники будет пустым и никто не будет в нем жить, пока комнаты и техника не появятся. Пустой дом - класс. Так что же такое использование класса без методов и значений переменных? Для этого рассмотрим пример целостного дома. Аналогично, класс будет идти вместе с группой значений переменных, методов и объектов. Классы и объекты – фундаментальные понятия объектно-ориентированного программирования (ООП). Класс запускается введением ключевого слова «класс» и рядом указывается название Вашего класса. Вы можете дать любое название для класса. Далее нужно открыть и закрыть скобки, как показано на примере. class ShanuHouseClass1   {   }   2. Объект Владелец дома может получить доступ и использовать все комнаты дома и технику. Аналогично, для доступа к классовому методу и значениям переменных нужно использовать объекты. Можно создать один или несколько объектов для того же класса. Например, можно сказать, что бывает один или много владельцев дома. Ниже Вы увидите пример объекта, где "objHouseOwner" - это объект класса, который будет использоваться для доступа ко всем переменным параметрам и методам класса. ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1();   3. Значение переменной Значения переменных используются для хранения наших характеристик. Наша характеристика может быть представлена в числовом виде или в виде текста. Например, чтобы сохранить номер телефона, можно использовать тип переменной "int", а чтобы сохранить имя, можно использовать измененный тип строки с именем для каждой переменной. Переменные могут быть локальными или глобальными. Например, если Вы покупаете новый телевизор, к Вам придет специалист, чтобы настроить телевидение. Он даст Вам свой контактный номер на будущее. Скорее всего, Вы запишите его номер на бумажке и положите ее туда, где сможете быстро найди, когда она понадобится. Если Вы будете хранить этот листок на видном месте, то все Ваши гости смогут увидеть его. Глобальные или общие переменные похожи на этот пример. Если определить значение переменной как глобальное, то все методы внутри класса смогут получить доступ к значению переменной. Если Вы храните бумажку с номером  в известном только Вам месте, то только Вы и видите контактный номер. Локальные частные переменные с этим схожи. Синтаксис значений переменных: Модификаторы доступа-тип данных-имя переменной По умолчанию доступ к модификаторам скрыт. Вы можете использовать общий доступ для переменных. Пример переменной: int noOfTV = 0;   public String yourTVName;   private Boolean doYouHaveTV = true;   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();          Console.WriteLine("You Have total " + objHouseOwner.noOfTV + " no of TV :");           Console.WriteLine("Your TV Name is :" + objHouseOwner.yourTVName);         }   }   В предыдущем примере программ Вы определили два значения переменных внутри класса. При применении основного метода создается объект класса. Можно получить доступ к значению переменной класса и вывести изображение. Основным методом является метод по умолчанию в C#, где каждый консоль и приложение для Windows начнет выполнять программу. В основном методе можно определить объект для класса и использовать его, можно получить доступ ко всем значениям переменных параметров и методов класса. Допустим, что каждый дом имеет въездные ворота. Используя ворота, Вы попадаете в  свой дом. Аналогично, чтобы запустить программу, должен быть метод по умолчанию, который будет запускать программу. Основной метод полезен при запуске программы. Каждый раз, когда Вы будете запускать C# Console или приложение Windows, основной метод будет выполняться первым. Из основного метода можно создать объект для других классов и использовать их методы. 4. Метод или функции (метод функционирования) Метод – это группа из операторов кода. Вот предыдущий пример программы с методом функционирования. class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);           Console.ReadLine();       }     static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();                 }   } Примечание: Большинство разработчиков интересовались разницей между методами и функциями. В этой статье понятие метода используется вместо понятия функции. Тем не менее, есть одно отличие между методами и функциями. В ООП языках, таких как C #, Java и т.д. используется термин метод, а для не-ООП программирования, таких как "C" и других – функция. Использование методов. Предположим, что у Вас есть мобильный телефон и Вы храните на нем много песен. Тем не менее, Вы всегда любите слушать определенные песни. Очень сложно каждый раз выискивать из сотен песен на телефоне любимую и проигрывать ее. Вместо того, чтобы проделывать одну и ту же работу много раз, Вы можете использовать плейлисты. Щёлкните на плейлист и слушайте любимую музыку. Это облегчит Вашу работу, и Вам не придется повторять одни и те же действия постоянно. Методы используются как плейлист. Можно писать повторные коды для одного метода, а затем при необходимости использовать его. В доме может быть одна большая комната или несколько комнат, и в каждой есть какое-то оборудование. Точно так же в классе можно увидеть один или несколько методов. В доме может быть две или три спальни, но кажая спальня отличается по размеру, цвету и так далее. Это означает, что одни и те же комнаты все равно разного типа. Так и в классе можно создать более одного метода с тем же именем, но с другим параметром. В ООП это называется "полиморфизм". Синтаксис функций. Модификаторы доступа, тип возвращения, название метода (список параметров): Модификаторы доступа: о них будет сказано далее в статье. Тип возвращения: Если Ваш метод возвращает значение, тогда Вам следует использовать тип возвращения с любым типом данных, такие как string, int и так далее. Если метод не возвращает значение, используйте тип "Void". Название метода: Здесь Вы задаете имя каждому методу. Список параметров: список параметров или аргументов, которые Вы передаете функции. Ниже приведен пример способа. • Метод с типом Void: Void - ключевое слово, благодаря которому данные из методов не возвращаются.  public void veranda()   {      Console.WriteLine("Welcome to Veranda");      Console.WriteLine("How Many Chairs Do you have in your Veranda");      NoofChair = Convert.ToInt32(Console.ReadLine());      Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda");   }   • Метод с типом возврата: метод обернется в какой-то результат, который может использоваться в программе. Например, возьмем метод TVNAME  с типом возврата "String". Можно сказать, что у Вас в доме есть телевизор в гостиной, родительской спальне и детской. В каждой комнате стоит телевизор разных фирм. Предположим, Вы хотите узнать название бренда телевизора. Вам нужно ввести один и тот же код трижды. Вместо повторного написания одинакового кода, Вы можете воспользоваться методом с типом возврата. public string TVNAME()   {      Console.WriteLine("Enter Your TV Brand NAME");      YOURTVName = Console.ReadLine();      return YOURTVName;   }   • Метод со списком параметров: До сих пор Вы видели методы без параметров. Параметры используются для передачи некоторых данных методу, чтобы осуществить Ваш процесс как нельзя лучше. Например, Вы хотите перекрасить спальни. Вам нужно посоветоваться со всеми членами семьи, которые проживают с Вами в доме, по поводу цвета стен в спальнях. Вы можете задать имя пользователя и их любимый цвет в качестве параметра метода. public void BedRoom(String nameandColor)   {      Console.WriteLine(nameandColor);    }   Тот же самый метод с другими параметрами называется методом перегрузки. Пример метода Вы найдете ниже. Оба метода называются одинаково, но имеют разные параметры.  public void BedRoom(String MemberName,String Color)    {        Console.WriteLine(MemberName + " Like " + Color + "Color");    }   Пример законченного класса с основным методом: class ShanuHouseClass1   {       int NoofChair = 0;      public String YOURTVName;      private Boolean DoyouHaveTV = true;      public void veranda()       {           Console.WriteLine("Welcome to Veranda");           Console.WriteLine("How Many Chairs Do you have in your Veranda");           NoofChair = Convert.ToInt32(Console.ReadLine());           Console.WriteLine("I have total " + NoofChair + " Chairs in my Veranda");       }     public string TVNAME()       {           Console.WriteLine("Enter Your TV Brand NAME");           YOURTVName = Console.ReadLine();           return YOURTVName;       }     public void BedRoom(String nameandColor)       {           Console.WriteLine(nameandColor);                  }     public void BedRoom(String MemberName,String Color)       {           Console.WriteLine(MemberName + " Like " + Color + "Color");       }     static void Main(string[] args)       {           ShanuHouseClass1 objHouseOwner = new ShanuHouseClass1();          objHouseOwner.veranda();           String returnvalue = objHouseOwner.TVNAME();          Console.WriteLine("Your TV BRAND NAME IS: "+returnvalue);          objHouseOwner.BedRoom("My Name is Shanu I like Lavender color");          objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color");          objHouseOwner.BedRoom("SHANU", "Lavender");           Console.ReadLine();         }   }   5. Модификаторы доступа Модификаторы доступа не что иное, как использование и ограничение типа значений переменных, методов и класса. Это можно назвать пределом безопасности. Шесть основных модификаторов доступа: частный публичный внутренний защищенный внутренний защищенный Частный модификатор доступа. Вернемся к примеру с домом. Охранник может охранять Ваш дом. Его обязанность - охранять вход в дом. Он не может зайти в дом и получить доступ ко всем вещам. Вы создаете SecurityGuardClass и называете переменную и метод для Security частным. Общественный модификатор доступа. Владельцы дома считаются общественными по отношению к классу. Они могут получить доступ ко всем классам, связанным с домом. Нет никаких ограничений на доступ к дому. Защищенный модификатор доступа. Только основной класс и производные классы могут иметь доступ к защищенным значениям переменных и методам. Например, служащие и гости – пример защищенного доступа. Служащие могут войти в любую комнату, прибраться там. Тем не менее, они имеют ограниченный доступ к дому, так как они не могут отдохнуть в постели хозяина дома. Внутренний модификатор доступа. Предел значения переменной или метода доступа существует в рамках проекта. Предположим, что в Вашем проекте существует более одного класса, и Вы объявили переменную в качестве внутреннего доступа в один класс. Посмотрите пример программы для внутренней переменной. public class sampleInternalClass   {       internal String myInternal = "Iam Internal Variable";   }   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);         }       static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();           sampleInternalClass intObj = new sampleInternalClass();          Console.WriteLine("Internal Variable Example :" + intObj.myInternal);           Console.ReadLine();       }   }   Внутренний модификатор защиты. Внутреннее защищенное значение переменной или метод имеет свои ограничения в рамках проекта класса или производного класса. Вот пример программы для внутренней защищенной переменной. В этом примере использован механизм наследования.  public class sampleProtectedInternalClass   {       protected internal String myprotectedInternal = "Iam Protected Internal Variable";       public void protectedInternalMethod()       {           Console.WriteLine("Protected Internal Variable Example :" + myprotectedInternal);       }   }   public class derivedClass : sampleProtectedInternalClass   {       public void derivedprotectedInternal()       {           Console.WriteLine("Derived Protected Internal Variable Example :" + myprotectedInternal);       }   }   class ShanuHouseClass   {       int noOfTV = 2;       public String yourTVName = "SAMSUNG";       public void myFirstMethod()       {           Console.WriteLine("You Have total " + noOfTV + "no of TV :");           Console.WriteLine("Your TV Name is :" + yourTVName);          }      static void Main(string[] args)       {           ShanuHouseClass objHouseOwner = new ShanuHouseClass();           objHouseOwner.myFirstMethod();           sampleProtectedInternalClass intObj = new sampleProtectedInternalClass();          intObj.protectedInternalMethod();          derivedClass proIntObj = new derivedClass();           proIntObj.derivedprotectedInternal();           Console.ReadLine();       }   }   6. Инкапсуляция Инкапсуляция скрывает элементы или значения переменных за пределами класса. Вы помните, что охранник не имеет права заходить в дом, он не должен быть в курсе того, что происходит в доме. Таким образом, для большей безопасности владелец дома скроет все, что происходит внутри, от охранника. Скрытие и ограничение называют инкапсуляцией. Например, у Вас есть два класса: первый называется "Houseclass" и другой – "houseSecurityClass". Вы видите значения переменных, спрятанных в классе, где "houseSecurityClass" – общественный, а "Houseclass" может получить доступ, но "Houseclass" имеет как общественные, так и частные значения переменной, в которой частное значение переменной класса не может быть доступным за пределами класса. public class houseSecurityClass   {       public int noofSecurity;       public String SecurityName = String.Empty;   }   public class Houseclass   {       private int noofLockerinHosue = 2;       public string OwnerName = String.Empty;   }   7. Абстракция Абстракция показывает и делит общие данные с пользователем. Прислуга в доме может заходить во все комнаты и убираться там. Владелец дома может предоставить полные и частичные права слуге для доступа к его дому. Ниже приведен пример программы, в которой частные значения переменных и методов не согласуются со слугой, но общественная переменная и методы согласовываются. public class HouseServerntClass   {       private int SaftyLoackerKeyNo = 10001;       public String roomCleanInstructions = "Clean All rooms";           private void saftyNos()           {               Console.WriteLine("My SaftyLoackerKeyNo is" + SaftyLoackerKeyNo);           }        public void roomCleanInstruction()       {            Console.WriteLine(roomCleanInstructions);       }     }   8. Наследование Наследование (подражание) используется для повторного использования кода. В защищенном внутреннем модификаторе доступа Вы уже видели пример программы наследования. Подражание - это не что иное, как доступ и использование всех базовых классовых значений переменных и методов в производном классе. Подражание может быть любым из следующих. Single level Inheritance: пример с одним базовым классом и одним производным public class baseClass   {       private void privateMethod()       {           Console.WriteLine("private Method");       }     public void publicMethod()       {           Console.WriteLine("This Method Shared");       }   }   public class DerivedClass : baseClass   {       static void Main(string[] args)       {           DerivedClass obj = new DerivedClass();         obj.publicMethod();   Примечание: Базовый класс - высший класс, а производный класс - это класс (ы), который наследует базовый. Наследование, где базовый класс - "GuestVist", а производный класс - "HouseOwnerClass". В даном случае класс HouseOwnerClass наследует базовый класс GuestVist: class GuestVist   {       public void Guestwelcomemessage()       {           Console.WriteLine("Welcome to our Home");       }       public void GuestName()       {           Console.WriteLine("Guest name is: Shanu");       }   }    class HouseOwnerClass : GuestVist   {       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.Guestwelcomemessage();           obj.GuestName();           Console.ReadLine();       }   }   Многозначное Наследование: рассмотрим пример с более чем одним производным классом. Первый базовый класс происходит с DerivedClass1, а затем DerivedClass1 возникает с DerivedClass2. Теперь с DerivedClass2 Вы можете получить доступ и к BaseClass, и DerivedClass1. public class baseClass   {       private void privateMethod()       {           Console.WriteLine("private Method");       }   public void publicMethod()       {           Console.WriteLine("This Method Shared");       }   }   public class DerivedClass1 : baseClass   {       public void DerivedClass1()       {           Console.WriteLine("Derived Class 1");       }   }   public class DerivedClass2 : DerivedClass1   {       static void Main(string[] args)       {           DerivedClass2 obj = new DerivedClass2();           obj.publicMethod();           obj.DerivedClass1();       } }   Множественное наследование: Поддерживает ли .Net множественное наследование? Ответ на этот вопрос - нет. В C #  невозможно использовать множественное наследование класса. Что такое множественное наследование? Множественное наследование имеет только один класс, и Вы можете наследовать оба класса в производном классе. Что произойдет, если ввести множественное наследование класса, используя C #? Вернемся к примеру с домом. Производный класс "HouseOwnerClass" с двумя дополнительными классами "GuestVist" и "FriendsandRelationsClass". Теперь предположим, что в Ваш дом пришел гость и друг. Для этого Вы вводите предыдущие три класса и наследуете два класса из Вашего производного класса. Если ввести множественное наследование в C #, на экране отразится предупреждение "Ожидание интерфейса" во время процесса кодирования и выполнения программы. 9. Полиморфизм Приставка «поли» означает больше, чем одна форма. В начале статьи в разделе выбор метода Вы уже видели пример полиморфизма. То же имя метода с другим параметром и есть примером полиморфизма. В полиморфизме используетс метод перегрузки и замещения. Полиморфизм имеет два способа выполнения программы: полиморфизм времени компиляции (Compile Time Polymorphism) и времени работы полиморфизма (Run time Polymorphism). Метод перегрузки. Метод перегрузки – тот же метод, используемый для более чем одного метода с другими аргументами. На примере ниже Вы видите, что имя метода «BedRoom» использовалось для двух методов, но параметры для каждого из них разные. class HouseOwnerClass   {      public void BedRoom(String nameandColor)       {           Console.WriteLine(nameandColor);       }       public void BedRoom(String MemberName, String Color)       {           Console.WriteLine(MemberName + " Like " + Color + "Color");       }       static void Main(string[] args)       {           HouseOwnerClass objHouseOwner = new HouseOwnerClass();          objHouseOwner.BedRoom("My Name is Shanu I like Lavender color");           objHouseOwner.BedRoom("My Name is Afraz I like Light Blue color");           objHouseOwner.BedRoom("SHANU", "Lavender");           Console.ReadLine();        }   }   Метод замещения. Разница между методом перезагрузки и замещения заключается в том, что при использовании метода перезагрузки Вы получите то же имя метода с другим аргументом. В методе замещения Вы получите то же имя метода, его параметры и тип, но метод замещения применим только к производным классам. Метод замещения не используется в одном и том же классе. Обратите внимание, как метод замещения можно использовать в абстрактном, виртуальном и недоступном методах. 10. Абстрактный класс/метод Абстрактный класс: у абстрактного класса ключевое слово abstract. abstract class GuestVist   {   }   Абстрактный класс – наивысший класс для всех классов. Объект не может получить доступ к абстрактному классу. Вы не сможете создать объект для абстрактного класса. Что произойдет, если попробовать создать объект для абстрактного класса? Пытаясь создать объект для абстрактного класса, на экране появится предупреждение об ошибке "экземпляр абстрактного класса не может быть создан". Что произойдет, если создать абстрактный метод, который не будет замещен в производном классе? На примере ниже показан абстрактный метод, который не замещен в производном классе. На экране высветилось предупреждение, которое гласит, что класс должен быть внедрен в абстрактный класс. Вы видите абстрактный класс, который имеет обычный метод и абстрактный метод. У абстрактных методов нет содержания в абстрактном классе, поэтому Вы можете только объявить абстрактный метод в абстрактном классе. Должен быть как минимум один абстрактный метод в абстрактном классе. abstract class GuestVist   {        public void Guestwelcomemessage()        {            Console.WriteLine("Welcome to our AbstractHome");        }        public void GuestName()        {            Console.WriteLine("Guest name is: Abstract");        }        public abstract void purposeofVisit();     }   public class Houseclass : GuestVist   {        static void Main(string[] args)        {            Houseclass objHouse = new Houseclass();            objHouse.Guestwelcomemessage();        }      public override void purposeofVisit()        {            Console.WriteLine("Abstract just came for a Meetup and spend some time ");        }   }   11. Виртуальный класс/метод Виртуальный метод полезен для современного программирования. Что такое виртуальный метод и какая от него польза? Например, гость говорит, что сегодня еще 5 человек посетят Ваш дом. Для этого Вы пишете функцию для отображения сообщения, поскольку пять гостей посетят Ваш дом. После визита, Вы видите, что в общей сложности Ваш дом посетило 20 человек. Цифра может быть больше или меньше заявленной. В таком случае, у гостей будет свой отдельный класс, и дом станет этим отдельным классом. Разница между абстрактным и виртуальным методами Оба метода используют ключевое слово override. Абстрактный метод может использоваться только в абстрактном классе. Это значит, что в абстрактном методе абстрактного класса нет основы. А в виртуальном методе есть. На примере ниже показан абстрактный и виртуальный метод. В абстрактном классе, виртуальный метод отмечает пять гостей, но в программе производного класса количество было изменено на 20 гостей. Какой же будет результат в виртуальном методе? 5 или 20 гостей?  abstract class GuestVist   {       public abstract void purposeofVisit();  // Abstract Method       public virtual void NoofGuestwillvisit()  // Virtual Method       {           Console.WriteLine("Total 5 Guest will Visit your Home");       }   }   class AbstractHouseClass : GuestVist   {       public override void purposeofVisit()  // Abstract method Override       {           Console.WriteLine("Abstract just for a Meetup and spend some time ");       }   public override void NoofGuestwillvisit() // Virtual method override       {           Console.WriteLine("Total 20 Guest Visited our Home");       }     static void Main(string[] args)       {           AbstractHouseClass objHouse = new AbstractHouseClass();          objHouse.purposeofVisit();           objHouse.NoofGuestwillvisit();           Console.ReadLine();       }   }   Завершенная программа abstract class GuestVist   {       public void Guestwelcomemessage()       {           Console.WriteLine("Welcome to our AbstractHome");       }       public void GuestName()       {           Console.WriteLine("Guest name is: Abstract");       }       public abstract void purposeofVisit();  // Abstract Method        public virtual void NoofGuestwillvisit()  // Virtual Method     {           Console.WriteLine("Total 5 Guest will Visit your Home");       }   }   class AbstractHouseClass : GuestVist   {       public override void purposeofVisit()  // Abstract method Override       {           Console.WriteLine("Abstract just for a Meetup and spend some time ");       }     public override void NoofGuestwillvisit() // Virtual method override       {           Console.WriteLine("Total 20 Guest Visited our Home");       }     static void Main(string[] args)       {           AbstractHouseClass objHouse = new AbstractHouseClass();           objHouse.Guestwelcomemessage();           objHouse.purposeofVisit();           objHouse.NoofGuestwillvisit();           Console.ReadLine();       }   }   12. Недоступный класс/метод Недоступный класс: этот класс не может быть унаследован другими классами. Например, у владельца дома есть потайная комната, возможно, кабинет. Владелец не хочет, чтобы посторонние имели доступ к его кабинету. В таких случаях будет полезен недоступный класс. Недоступный класс вводится с помощью ключевого слова Sealed. Если класс объявлен Sealed, он не может быть унаследован другими производными классами.  Что произойдет, если Вы унаследуете надоступный класс в производном классе? Рассмотрим пример ниже. Вы видите пример программы недоступного класса. public sealed class OwnerofficialRoom   {       public void AllMyPersonalItems()       {           Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");       }   }   class HouseSealedClass    {       static void Main(string[] args)       {           OwnerofficialRoom obj = new OwnerofficialRoom();           obj.AllMyPersonalItems();           Console.ReadLine();       }   }   Недоступный метод: Если Вы объявили метод недоступным, то нельзя заместить определенный метод в производном классе. Давайте посмотрим Ваш класс дома, где есть базовый класс с виртуальным методом и виртуальным недоступным методом. Виртуальный метод может быть замещен в производном классе. Но виртуальный недоступный метод нельзя заместить в недоступном классе. public class OwnerOfficialroomwithrestriction   {       public virtual void message()       {           Console.WriteLine("Every one belongs to this house can access my items in my room except my sealed Item");      }       public virtual sealed void myAccountsLoocker()       {           Console.WriteLine("This Loocker can not be inherited by other classes");       }   }   class HouseSealedClass : OwnerOfficialroomwithrestriction   {       public override void message()       {           Console.WriteLine("overrided in the derived class");       }       public override void myAccountsLoocker()       {           Console.WriteLine("The sealed method Overrides");       }   }   13. Статический класс/метод Статический класс и недоступный класс нельзя унаследовать. Разница между статическим и недоступным классами Можно создать объект (пример) недоступного класса. В секции недоступного класса создать образец недоступного класса, а в главном методе создать объект для доступа к недоступному классу. В недоступном классе можно прописать статические и нестатические методы. А для статического класса создать объект нельзя. В статическом классе допускаются только статические члены. То есть, в статическом классе нельзя прописать нестатические методы. В принципе, основной метод – пример статического метода. Когда Вы создадите консольное приложение в C #, увидите, что каждый класс имеет основной метод по умолчанию. Когда консоль или приложение Windows начинают выполняться, первым выполняется основной метод. Нет необходимости создавать объект основного метода, так как он был объявлен, как статический метод. В статическом классе память выделяется для всех статических переменных и методов во время выполнения, но для нестатических значений переменных и методов память выделяется только тогда, когда создается объект класса. Что произойдет, если ввести нестатических метод в статический класс? Вы увидите сообщение об ошибке: "Не удается создать экземпляр статического класса". Как вызвать статический класс метода и значение переменной, не создавая объект. Очень просто. Можно использовать "ClassName.Variable или Method Name", например, "OwnerofficialRoom.AllMyPersonalItems ();" Смотрите следующий пример со статическим классом: public static class OwnerofficialRoom   {       public static void AllMyPersonalItems()       {           Console.WriteLine("All Items in this rooms are personal to me no one else can access or inherit me");       }   }   class HouseStaticClass    {       static void Main(string[] args)       {           OwnerofficialRoom.AllMyPersonalItems();           Console.ReadLine();       }   }   Результат предыдущей программы показан ниже: Можно ли создать статический метод в нестатическом классе? Да, можно создать статический метод в нестатическом классе. Нет необходимости создавать объект для доступа статического метода (ов) в нестатическом классе. Можно непосредственно использовать имя класса для доступа к статическому методу. Пример статического метода в нестатическом классе. public  class OwnerofficialRoom   {       public static void AllMyPersonalItems()       {           Console.WriteLine("No need to create object for me just use my class name to access me :)");       }      public void non_staticMethod()       {           Console.WriteLine("You need to create an Object to Access Me :(");       }   }   class StaticmethodClass   {       static void Main(string[] args)       {           OwnerofficialRoom.AllMyPersonalItems();           OwnerofficialRoom obj = new OwnerofficialRoom();           obj.non_staticMethod();           Console.ReadLine();       }   }   14. Интерфейс Интерфейс похож на абстрактный класс, но в интерфейсе существует только имя метода. Однако, в абстрактном классе можно иметь метод объявления и определения. Методы интерфейса должны быть реализованы в  примененном классе. Смотрите следующий пример программы для интерфейса. Все методы интерфейса были реализованы в классе. Как уже было отмечено, С # не поддерживает множественное наследование. Чтобы получить множественное наследование, можно использовать интерфейс. Следующая программа – пример множественного наследования с использованием интерфейса. interface GuestInterface   {       void GuestWelcomeMessage();       void NoofGuestes();   }   interface FriendsandRelationsInterface   {       void friendwelcomemessage();       void FriendName();   }   class HouseOwnerClass : GuestInterface, FriendsandRelationsInterface   {       public void GuestWelcomeMessage()       {           Console.WriteLine("All guests are well come to our home");       }     public void NoofGuestes()       {           Console.WriteLine("Total 15 Guestes has visited");       }     public void friendwelcomemessage()       {           Console.WriteLine("Welcome to our Home");       }       public void FriendName()       {           Console.WriteLine("Friend  name is: Afraz");       }       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.GuestWelcomeMessage();           obj.NoofGuestes();           obj.friendwelcomemessage();           obj.FriendName();           Console.ReadLine();       }   }   Иногда необходимо иметь определенные методы, которые будут использоваться во многих производных классах. Каждый производный класс может выполнять различные функции для этих методов. В таких случаях можно использовать интерфейс. Проведем аналогию с гостями, которые посещают Ваш дом. Предположим, для гостей разослали два типа сообщений: "Добро пожаловать" и "Вход для гостей запрещен". Функции являются общими, но разнятся для каждого владельца в одном и том же доме. Гость может быть гостем отца, матери, детей или всей семьи. У каждого гостя свое сообщение-приглашение, но функции те же, что в сообщении. Отец – это класс, мать – класс и дети – один класс. Оба сообщения для гостей «Добро пожаловать» и «Вход для гостей запрещен" – одинаковы для всех. В этом случае, можно создать интерфейс и объявить оба метода в интерфейсе. Классы отца, матери и детей могут наследовать интерфейс и вводить собственные детали метода. Интерфейс похож на абстрактный класс, но главное отличие между абстрактным классом и интерфейсом в том, что в абстрактном классе есть абстрактный и неабстрактный методы. Но по умолчанию в интерфейсе все методы являются абстрактными. Поэтому в интерфейсе нет неабстрактного метода. Все методы, объявленные в интерфейсе, должны быть замещены в производном классе. Что произойдет, если объявить неабстрактные методы в интерфейсе? Вы увидете предупреждение "неожиданный модификатор" в модификаторе доступа и "неожиданное содержание метода" в тексте сообщения. Пример программы для интерфейса: interface GuestInterface   {       void GuestWelcomeMessage();       void NoofGuestes();         }   class HouseOwnerClass: GuestInterface   {       public  void GuestWelcomeMessage()       {           Console.WriteLine("All guests are well come to our home");       }       public  void NoofGuestes()       {           Console.WriteLine("Total 15 Guestes has visited");       }       static void Main(string[] args)       {           HouseOwnerClass obj = new HouseOwnerClass();           obj.GuestWelcomeMessage();           obj.NoofGuestes();           Console.ReadLine();       }   }   Источник: http://www.c-sharpcorner.com/UploadFile/asmabegam/basic-concept-of-oop-in-C-Sharp/
Notification success