• Добро пожаловать на сайт - Forumteam.men !

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

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

21. Абстрагируемся.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.343
Реакции
8.371
Баллы
1.200
FTC
203¢
Абстрактный класс.
Предположим в базовом классе для какого-то наследуемого метода трудно придумать осмысленное наполнение. Например, вы реализуете иерархию геометрических фигур, и есть некоторый родительский класс Figure в котором определен метод Draw.

Задачей этого метода является рисование фигуры, однако для Figure тело Draw придется, скорее всего, оставить пустым, так как нарисовать абстрактную фигуру достаточно проблематично.
В этом случае вы можете объявить метод как абстрактный и не наполнять его каким – либо содержимым. Для этого нужно при объявлении метода указать модификатор abstract и не определить ему тела.

Класс, в котором существует хотя бы один абстрактный метод называется абстрактным классом. Класс, содержащий один или более абстрактных методов должен быть объявлен как абстрактный с помощью модификатора abstract. Невозможно создать ни одного объекта такого класса. Кстати вам уже известно данное понятие из C++ под названием абстрактный базовый класс.

Каждый дочерний класс, отнаследованный от абстрактного обязан реализовать все абстрактные методы, иначе класс-потомок также становится абстрактным и ему также нужно будет указать модификатор abstract. Абстрактный метод автоматически становится виртуальным, так что модификатор virtual при объявлении такого метода не нужен. Если же попытаться его указать произойдет ошибка на этапе компиляции.

В классе потомке при реализации абстрактного метода в объявлении нужно будет указать ключевое слово override.
Рассмотрим пример:
Код:
using System;
abstract class Figure{ // Абстрактный класс
    public Figure(string n){
        name=n;
    }
    private string name;
    public abstract void Draw(); // Абстрактный метод
    public void ShowName(){
        Console.WriteLine(name);
    }
}
class Rectangle:Figure{
    int width;
    int height;
    public    Rectangle(int height,int width):base("Прямоугольник"){
        this.width = width;
        this.height = height;
    }
    public override void Draw(){ // реализация абстрактного метода
        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){
                Console.Write("*");
            }
            Console.WriteLine();
        }
    }
}

class Sample
{
    static void Main()
    {
        try{
            Rectangle rect = new Rectangle(3,8);
            rect.ShowName();
            rect.Draw();
        }
        catch(Exception e){
            Console.WriteLine(e.Message);
        }
        Console.Read();
    }
}
 
Сверху Снизу