Главная страница
Навигация по странице:

  • 2. Классы в C. Конструкторы, деструкторы, методы. Виды параметров методов.

  • 4. Наследование в C. Раннее и позднее связывание. Виртуальные методы. Абстрактные и бесплодные классы.

  • Даб работа по методам программирования. обновлено пронько. 1. Классы в C#. Модификаторы доступа. Поля, свойства, индексаторы


    Скачать 0.78 Mb.
    Название1. Классы в C#. Модификаторы доступа. Поля, свойства, индексаторы
    АнкорДаб работа по методам программирования
    Дата11.03.2023
    Размер0.78 Mb.
    Формат файлаdocx
    Имя файлаобновлено пронько.docx
    ТипДокументы
    #980160
    страница1 из 6
      1   2   3   4   5   6


    1. Классы в C#. Модификаторы доступа. Поля, свойства, индексаторы.

    Модификаторы доступа позволяют задать допустимую область видимости для компонентов класса.

    В языке C# применяются следующие модификаторы доступа:

    1. private: закрытый или приватный компонент класса или структуры. Приватный компонент доступен только в рамках своего класса или структуры.

    2. private protected: компонент класса доступен из любого места в своем классе или в производных классах, которые определены в той же сборке.

    3. file: добавлен в версии C# 11 и применяется к типам, например, классам и структурам. Класс или структура с таким модификатором доступны только из текущего файла кода.

    4. protected: такой компонент класса доступен из любого места в своем классе или в производных классах. При этом производные классы могут располагаться в других сборках.

    5. internal: компоненты класса или структуры доступен из любого места кода в той же сборке, однако он недоступен для других программ и сборок.

    6. protected internal: совмещает функционал двух модификаторов protected и internal. Такой компонент класса доступен из любого места в текущей сборке и из производных классов, которые могут располагаться в других сборках.

    7. public: публичный, общедоступный компонент класса или структуры. Такой компонент доступен из любого места в коде, а также из других программ и сборок.

    Модификаторы

    Текущий класс

    Производный класс из текущей сборки

    Производный класс из другой сборки

    Непроизводный класс из текущей сборки

    Непроизводный класс из другой сборки

    private

    +













    private protected

    +

    +










    protected

    +

    +

    +







    internal

    +

    +




    +




    protected internal

    +

    +

    +

    +




    public

    +

    +

    +

    +

    +

    Поле — это переменная любого типа, которая объявлена непосредственно в классе или структуре. Поля объявляются в блоке класса или структуры путем указания уровня доступа поля, за которым следует тип поля, а затем имя поля.

    1. private int number;

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

    1. [модификаторы] тип_свойства название_свойства

    2. {

    3. get { действия, выполняемые при получении значения свойства}

    4. set { действия, выполняемые при установке значения свойства}

    5. }

    Свойства могут иметь модификаторы доступа. Одновременное присутствие get и set необязательно.

    Автосвойства:

    1. public int Age { get; set; }

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

    Общие сведения об индексаторах:

    1. Индексаторы позволяют индексировать объекты так же, как и массивы.

    2. Метод доступа get возвращает значение. Метод доступа set назначает значение.

    3. Ключевое слово this используется для определения индексаторов.

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

    5. Индексаторы не нужно индексировать по целому значению; пользователь может определить конкретный механизм поиска на свое усмотрение.

    6. Индексаторы могут быть перегружены.

    7. Индексаторы могут иметь более одного формального параметра, например при доступе к двумерному массиву.

    Пример использования индексаторов:

    1. using System;

    2.  

    3. class SampleCollection

    4. {

    5. // Declare an array to store the data elements.

    6. private T[] arr = new T[100];

    7.  

    8. // Define the indexer to allow client code to use [] notation.

    9. public T this[int i]

    10. {

    11. get { return arr[i]; }

    12. set { arr[i] = value; }

    13. }

    14. }

    15.  

    16. class Program

    17. {

    18. static void Main()

    19. {

    20. var stringCollection = new SampleCollection();

    21. stringCollection[0] = "Hello, World";

    22. Console.WriteLine(stringCollection[0]);

    23. }

    24. }

    25. // The example displays the following output:

    26. // Hello, World.

    2. Классы в C#. Конструкторы, деструкторы, методы. Виды параметров методов.

    Программы на C# представляются в виде взаимосвязанных взаимодействующих между собой классов, т.к. данный язык программирования является полноценным объектно-ориентированным.

    Описание объекта – класс, а экземпляр – объект класса. Класс определяется при помощи ключевого слова class после которого идет название класса, после двоеточия наследуемые классы или интерфейсы и в фигурных скобках тело класса (методы, поля, конструкторы, деструкторы).

    Класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.

    public void GrowUp()

    {

        Age++;

    }

    Для создания объекта применяются конструкторы. По сути, конструкторы представляют специальные методы, которые называются так же, как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта.

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

    Конструктор с параметрами в свою очередь принимает на вход параметры и выполняет с ним некоторые операции.

    public Human(double _age, string _name)

    {

        Age = _age;

        Name = _name;

    }

    Вызов конструктора осуществляется при помощи ключевого слова new.

    Human human = new Human(24, "Генадий");

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

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

    Human() {}

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

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

    тип_метода имя_метода (тип_параметра1 параметр1, тип_параметра2 параметр2, ...)

    {

    // действия метода

    }

    Значения, которые передаются параметрам, еще называются аргументами.

    Можно встретить такие определения как формальные параметры и фактические параметры. Формальные параметры — это собственно параметры метода, а фактические параметры - значения, которые передаются формальным параметрам.

    По умолчанию при вызове метода необходимо предоставить значения для всех его параметров. Но C# также позволяет использовать необязательные параметры. Для таких параметров нам необходимо объявить значение по умолчанию. Также следует учитывать, что после необязательных параметров все последующие параметры также должны быть необязательными:

    void PrintPerson(string name, int age = 1, string company = "Undefined")

    {

        Console.WriteLine($"Name: {name}  Age: {age}  Company: {company}");

    }

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

    void PrintPerson(string name, int age = 1, string company = "Undefined")

    {

        Console.WriteLine($"Name: {name}  Age: {age}  Company: {company}");

    }

     

    PrintPerson("Tom", company:"Microsoft", age: 37);  // Name: Tom  Age: 37  Company: Microsoft

    PrintPerson(age:41, name: "Bob");          // Name: Bob  Age: 41  Company: Undefined

    PrintPerson(company:"Google", name:"Sam"); // Name: Sam  Age: 1   Company: Google


    3. Перегрузка методов. Перегрузка унарных и бинарных операций. Перегрузка операций преобразования типа.

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

    Перегрузка унарных и бинарных операций

    Операция

    Возможность перегрузки

    +, -, !, ++, --, true, false

    Этот набор унарных операций может быть перегружен

    +, -, *, /, %, &, |, ^, <<, >>

    Эти бинарные операции могут быть перегружены

    ==, !=, <, >, <=, >=

    Эти операции сравнения могут быть перегружены. C# требует совместной перегрузки "подобных" операций (т.е. < и >, <= и >=, == и !=)

    []

    Операция [] не может быть перегружена. Однако, аналогичную функциональность предлагают индексаторы

    ()

    Операция () не может быть перегружена. Однако ту же функциональность предоставляют специальные методы преобразования

    +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

    Сокращенные операции присваивания не могут перегружаться; однако вы получаете их автоматически, перегружая соответствующую бинарную операцию

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

    действие оператора относительно своего класса. Существуют две формы операторных методов (operator): одна - для унарных операторов, другая - для бинарных. Ниже приведена общая форма для

    Каждой разновидности этих методов:

    1. // Общая форма перегрузки унарного оператора.

    2. public static возвращаемый_тип operator op(тип_параметра операнд)

    3. {

    4. // операции

    5. }

    6.  

    7. // Общая форма перегрузки бинарного оператора.

    8. public static возвращаемый_тип operator op(тип_параметра1 операнд1,

    9. тип_параметра2 операнд2)

    10. {

    11. // операции

    12. }

    Пример:

    1. class MyArr

    2. {

    3. // Координаты точки в трехмерном пространстве

    4. public int x, y, z;

    5.  

    6. public MyArr(int x = 0, int y = 0, int z = 0)

    7. {

    8. this.x = x;

    9. this.y = y;

    10. this.z = z;

    11. }

    12.  

    13. // Перегружаем бинарный оператор +

    14. public static MyArr operator +(MyArr obj1, MyArr obj2)

    15. {

    16. MyArr arr = new MyArr();

    17. arr.x = obj1.x + obj2.x;

    18. arr.y = obj1.y + obj2.y;

    19. arr.z = obj1.z + obj2.z;

    20. return arr;

    21. }

    22.  

    23. // Перегружаем бинарный оператор -

    24. public static MyArr operator -(MyArr obj1, MyArr obj2)

    25. {

    26. MyArr arr = new MyArr();

    27. arr.x = obj1.x - obj2.x;

    28. arr.y = obj1.y - obj2.y;

    29. arr.z = obj1.z - obj2.z;

    30. return arr;

    31. }

    32. }

    Перегрузка операция преобразования типа:

    Существуют две формы операторов преобразования: явная и неявная. Ниже они представлены в общем виде:

    1. public static explicit operator целевой_тип(исходный_тип v) {return значение;}

    2. public static implicit operator целевой_тип(исходный_тип v) {return значение; }

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

    Если же оператор преобразования указан в явной форме (explicit), то преобразование вызывается в том случае, когда выполняется приведение типов. Для одних и тех же исходных и целевых типов данных нельзя указывать оператор преобразования одновременно в явной и неявной форме.

    На операторы преобразования накладывается ряд следующих ограничений:

    1. Исходный или целевой тип преобразования должен относиться к классу, для которого объявлено данное преобразование. В частности, нельзя переопределить преобразование в тип int, если оно первоначально указано как преобразование в тип double.

    2. Нельзя указывать преобразование в класс object или же из этого класса.

    3. Для одних и тех же исходных и целевых типов данных нельзя указывать одновременно явное и неявное преобразование.

    4. Нельзя указывать преобразование базового класса в производный класс.

    5. Нельзя указывать преобразование в интерфейс или же из него.

    Пример:

    1. class UserInfo

    2. {

    3. public string Name, Family;

    4. public byte Age;

    5.  

    6. public UserInfo(string Name, string Family, byte Age)

    7. {

    8. this.Name = Name;

    9. this.Family = Family;

    10. this.Age = Age;

    11. }

    12.  

    13. // Явное преобразование типа UserInfo к string

    14. public static explicit operator string(UserInfo obj)

    15. {

    16. return "Информация о пользователе: " + obj.Name + " " + obj.Family + " (" +obj.Age+" лет)";

    17. }

    18. }

    19.  

    4. Наследование в C#. Раннее и позднее связывание. Виртуальные методы. Абстрактные и бесплодные классы.

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

    C# и .NET поддерживают только одиночное наследование. Это означает, что каждый класс может наследовать члены только одного класса.

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

    C# также предоставляет возможность переопределять наследуемые методы. Для этого необходимо, чтобы родительский класс определил данный метод с модификатором virtual. После, производный класс должен определить этот метод с модификатором override. Определяя метод виртуальным, c# создаст виртуальную таблицу функций и и поместит в нее информацию о данном методе. За счет виртуальной таблицы функций мы можем переопределять методы базового класса у класса наследника и при этом, работая с данным классом как с базовым классом, будут вызываться переопределенные методы.

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

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

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

    Раннее связывание - это процесс привязки вызовов методов к правильной реализации метода во время компиляции. Это означает, что компилятор определяет правильный метод для вызова на основе типов аргументов, переданных методу, и генерирует код для вызова метода. Раннее связывание применяется для вызова не виртуальных/не абстрактных методов.

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

    Бесплодный класс - это класс с модификатором sealed. От такого класса невозможно наследоваться. Также данным модификатором можно пометить переопределение виртуального метода, тем самым наследник не сможет переопределить виртуальный метод, который переопределяет родительский класс.

    Пример:

    abstract class Animal {

    public string Name;
    public Animal(string name) {

    Name = name;

    }
    public abstract void MakeASound()

    {

    }
    public virtual void Move()

    {

    Console.WriteLine($"{Name} движется!");

    }

    }
    sealed class Cat : Animal {

    public Cat(string name): base(name)

    {

    }
    public override void MakeASound()

    {

    Console.WriteLine($"Мяу!");

    }
    public override void Move()

    {

    Console.WriteLine($"Меня зовут {Name}. Я кот и я движусь!");

    }

    }
      1   2   3   4   5   6



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