Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
1

Объясните, для чего вообще нужен абстрактный метод?

01.04.2014, 12:46. Просмотров 915. Ответов 7
Метки нет (Все метки)

Доброе время суток, объясните пожалуйста, для чего вообще нужен абстрактный метод?
В каких случаях он необходим?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2014, 12:46
Ответы с готовыми решениями:

Для чего вообще нужен полиморфизм. Какая польза от наследования
Здравствуйте всем. Кто зашел в эту ветку форума. Вопрос такой. Есть ООП и один...

Объясните для чего нужны архитектурные слои
Доброго времени суток Я искала в гугле объяснение трех основных слоев user...

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

Для чего нужен this?
Привет, хочу чтоб мне обяснили что такое this, для чево оно, я пишу программы...

Для чего нужен C#?
Для чего нужен C#? На чем луче писать интернет-приложения и Online игры?

7
Spawn
972 / 870 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
01.04.2014, 12:52 2
Лучший ответ Сообщение было отмечено iser как решение

Решение

Абстрактные методы могут встречаться только в абстрактных классах. Они нужны для указания обязательной реализации метода классом наследником.
C#
1
2
3
4
5
6
7
8
9
10
11
12
        abstract class Base
        {
            public abstract void test();
        }
 
        class Child : Base
        {
            public override void test()
            {
                throw new NotImplementedException();
            }
        }
Без реализации метода test в классе Child компилятор выдаст ошибку:
does not implement inherited abstract member 'Base.test()'
Добавлено через 1 минуту
Данные методы также являются виртуальными, но не содержат тела в базовом классе.

Ну и читаем спецификацию.
4
kolorotur
Эксперт .NET
10496 / 8683 / 2160
Регистрация: 17.09.2011
Сообщений: 14,901
Завершенные тесты: 1
01.04.2014, 13:00 3
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

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

Простой пример — класс Stream, описывающий поток входящих/исходящих данных.
У этого класса есть метод Read, считывающий данные из источника. Стандартное действие.

Сами потоки данных могут иметь разные источники, не имеющие между собой ничего общего: файл (FileStream), сеть (NetworkStream), основная память (MemoryStream), память какого-нибудь девайса и т.д.
Реализация считывания этих данных зависит строго от источника, потому в классе Stream, описывающем любой поток данных в принципе, физически невозможно прописать какую-то дефолтную реализацию, потому как данный класс не описывает ни один конкретный источник.
А значит метод объявляется как абстрактный, то есть обязательный к реализации наследниками класса Stream, т.к. без него невозможна работа входящего потока данных.
1
агерон
274 / 281 / 58
Регистрация: 12.10.2009
Сообщений: 1,108
01.04.2014, 13:24 4
Абстрактные методы нужны для правильной инициализации таблицы виртуальных методов которая используется при реализации позднего связывания, благодаря ТВМ возможен вызов метода реализованного в классе - потомке через указатель класса - предка, что приводит к возможности однообразно обрабатывать множество объектов классов - потомков через указатели на базовый класс

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace _1135731
{
    public abstract class Base
    {
        public abstract void Method();
    }
 
    public class Child1:Base
    {
        public override void Method()
        {
            Console.WriteLine("I am Child1!!!");
        }
    }
 
    public class Child2:Base
    {
        public override void Method()
        {
            Console.WriteLine("I am Child2!!!");
        }
    }
 
    public class Grandchild1:Base
    {
        public override void Method()
        {
            Console.WriteLine("I am Grandchild1!!!");
        }
    }
    
    public class Grandchild2 : Base
    {
        public override void Method()
        {
            Console.WriteLine("I am Grandchild2!!!");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var elements = new List<Base>();
            elements.Add(new Child1());
            elements.Add(new Child2());
            elements.Add(new Grandchild1());
            elements.Add(new Grandchild2());
            elements.ForEach(element=>element.Method());
            Console.Read();
        }
    }
}
1
kolorotur
Эксперт .NET
10496 / 8683 / 2160
Регистрация: 17.09.2011
Сообщений: 14,901
Завершенные тесты: 1
01.04.2014, 13:35 5
Цитата Сообщение от агерон Посмотреть сообщение
Абстрактные методы нужны для правильной инициализации таблицы виртуальных методов которая используется при реализации позднего связывания, благодаря ТВМ возможен вызов метода реализованного в классе - потомке через указатель класса - предка, что приводит к возможности однообразно обрабатывать множество объектов классов - потомков через указатели на базовый класс
В этом плане абстрактный метод ничем не отличается от виртуального.
Вопрос же был конкретно про абстрактный
1
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
01.04.2014, 14:24  [ТС] 6
Спасибо всем за полный ответ. Вопросов больше нет.
0
агерон
274 / 281 / 58
Регистрация: 12.10.2009
Сообщений: 1,108
01.04.2014, 20:22 7
Kolorotur: В этом плане абстрактный метод ничем не отличается от виртуального.
Вопрос же был конкретно про абстрактный
Абстрактный метод - это чистый виртуальный метод так что то что я написал выше на счет VMT с 100% вероятностью относиться и к абстрактным методам/классам
0
kolorotur
Эксперт .NET
10496 / 8683 / 2160
Регистрация: 17.09.2011
Сообщений: 14,901
Завершенные тесты: 1
02.04.2014, 11:47 8
Цитата Сообщение от агерон Посмотреть сообщение
Абстрактный метод - это чистый виртуальный метод так что то что я написал выше на счет VMT с 100% вероятностью относиться и к абстрактным методам/классам
Я же не о том, чем отличается абстрактный от виртуального, а вот об этом определении:

Цитата Сообщение от агерон Посмотреть сообщение
Абстрактные методы нужны для правильной инициализации таблицы виртуальных методов которая используется при реализации позднего связывания, благодаря ТВМ возможен вызов метода реализованного в классе - потомке через указатель класса - предка, что приводит к возможности однообразно обрабатывать множество объектов классов - потомков через указатели на базовый класс
Меняем первое слово с "абстрактный" на "виртуальный" и определение остается истинным.

Автор же конкретно спрашивал о назначении именно абстрактных методов.
Не о том, что такое абстрактные методы.
Не о том, чем они отличаются от виртуальных.
А о том, для чего они вообще нужны
Цитата Сообщение от iser Посмотреть сообщение
для чего вообще нужен абстрактный метод?
В каких случаях он необходим?
0
02.04.2014, 11:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 11:47

Для чего нужен for?
Объясните пожалуйста для чего служит for? Ввел в консоль for ( int i = 0; i...

Для чего нужен MemoryStream?
Разбираю потоки. Как я понял, он нужен для временного хранения информации в...

Invalidate() - для чего он нужен?
Ребят, подскажите. Я уверен, что заблуждаюсь (иначе не было бы этого метода),...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru