Абстрактные классы в си шарп - насколько полезны?

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Интересует мнение основанное на практике - насколько полезно и в каких случаях - создавать абстрактные классы?

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

самым легким для понимания был бы пример - когда нельзя обойтись без абстрактного класса.
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Абстрактные классы и зеннопостер не имеют ничего пересекающегося. Это как сравнивать популяцию кроликов во Франции и зависимость напряжения от силы тока.
На деле абстрактные классы очень полезны тем, что они реализуют общую для наследуемых классов логику, в то время как интерфейсы просто указывают сигнатуры реализующих этот интерфейс классов. Типичным примером является класс Stream.
 
  • Спасибо
Реакции: surrealmix

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
я так и знал ))))
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
Абстрактные классы и зеннопостер не имеют ничего пересекающегося. Это как сравнивать популяцию кроликов во Франции и зависимость напряжения от силы тока.
На деле абстрактные классы очень полезны тем, что они реализуют общую для наследуемых классов логику, в то время как интерфейсы просто указывают сигнатуры реализующих этот интерфейс классов. Типичным примером является класс Stream.
ты когда расписываешь примеры приводи но только свои
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
ты когда расписываешь примеры приводи но только свои
Ну ты же опытный, давай-ка распиши сам. Я же новичок, мало что знаю, мало что умею, только умные словечки сказал и пошел дальше.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
Ну ты же опытный, давай-ка распиши сам. Я же новичок, мало что знаю, мало что умею, только умные словечки сказал и пошел дальше.
а зачем много столько слов, покажи пример коль выступил первый

P.S./ и что за такая слабость человека писать сразу о тупом, типо ты умный ты покажи, расскажи, разжуй и проглати ))))
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
На деле абстрактные классы очень полезны тем, что они реализуют общую для наследуемых классов логику, в то время как интерфейсы просто указывают сигнатуры реализующих этот интерфейс классов.
так кроме названий в абстрактных классах ничего нет, про какую логику?
для меня это просто типа - я архитектор - я описал абстрактные классы - а ты думай как реализовывать... а если я один работаю - на кой чёрт мне абстрактные классы?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Ты явно че-то не то читаешь. В абстрактном классе можно использовать обычные методы, виртуальные методы и абстрактные методы. Вот код, который это все доказывает:

Код:
using System;

namespace ConsoleApp1
{
    class Program
    {
        public delegate int BinaryOp(int x, int y);

        static void Main(string[] args)
        {
            BaseClass baseTest = new Child();
            baseTest.FirstMethod();
            baseTest.SecondMethod();
            baseTest.ThirdMethod();
            Console.ReadLine();
        }
    }

    abstract class BaseClass
    {
        string text { get; set; } = "first method";

        public void FirstMethod()
        {
            Console.WriteLine(text);
        }

        public abstract void SecondMethod();

        public virtual void ThirdMethod()
        {
            Console.WriteLine("third method");
        }
    }

    sealed class Child : BaseClass
    {
        public override void SecondMethod()
        {
            Console.WriteLine("second method");
        }
    }
}
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Ты явно че-то не то читаешь. В абстрактном классе можно использовать обычные методы, виртуальные методы и абстрактные методы. Вот код, который это все доказывает:
да можно использовать и обычные методы, но в том то и вопрос - зачем абстракция - которая не содержит реализации, всё равно же потом надо писать этот метод, какая польза от абстракции? (я не говорю про обычные методы в абстрактных классах).. зачем тратить время на написание абстрактного класса - если работаешь один? что даёт - какие преимущества в использовании слова "абстракт" и методов без реализации - насколько мне известно - от абстрактного класса нельзя создавать объекты и обязательно надо переопределить абстрактные члены... я не говорю же, что не нужна абстракция в классах, но "абстрактным" по сути может быть любой обычный базовый класс - без использования слова - абстракт. Примерно такое же ощущение интерфейсов - не совсем понятно для чего что-то писать дважды - если можно сразу писать программу.. вот и прошу пояснить простым языком - какая польза от абстрактных членов - кроме напоминания что их нужно создать в производном классе, просто когда пишешь один - то зачем тебе самому себе напоминать)) это примерно так - я собрал в голове алгоритм - и начинаю с того, что пишу не рабочий код, а напоминания для рабочего кода. Может это востребовано когда программы сильно большие? нет до конца у меня понимания - вот и спрашиваю - какая практическая польза, на наглядном примере из жизни - где нельзя обойтись обычным базовым классом?
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
да можно использовать и обычные методы, но в том то и вопрос - зачем абстракция - которая не содержит реализации, всё равно же потом надо писать этот метод, какая польза от абстракции? (я не говорю про обычные методы в абстрактных классах).. зачем тратить время на написание абстрактного класса - если работаешь один? что даёт - какие преимущества в использовании слова "абстракт" и методов без реализации - насколько мне известно - от абстрактного класса нельзя создавать объекты и обязательно надо переопределить абстрактные члены... я не говорю же, что не нужна абстракция в классах, но "абстрактным" по сути может быть любой обычный базовый класс - без использования слова - абстракт. Примерно такое же ощущение интерфейсов - не совсем понятно для чего что-то писать дважды - если можно сразу писать программу.. вот и прошу пояснить простым языком - какая польза от абстрактных членов - кроме напоминания что их нужно создать в производном классе, просто когда пишешь один - то зачем тебе самому себе напоминать)) это примерно так - я собрал в голове алгоритм - и начинаю с того, что пишу не рабочий код, а напоминания для рабочего кода. Может это востребовано когда программы сильно большие? нет до конца у меня понимания - вот и спрашиваю - какая практическая польза, на наглядном примере из жизни - где нельзя обойтись обычным базовым классом?
Думаю начать нужно с того понимаешь ли ты что такое "абстракция" ?
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
воробей - конкретный класс, а птица - абстракция... примерно так)) может и не прав, но потому и спрашиваю
так и есть )))
деньги, машина, человек, самолет, ручка все что угодно, все то что не существует ))) ЛОЖКА- помнишь из матрицы )))
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
так и есть )))
деньги, машина, человек, самолет, ручка все что угодно, все то что не существует ))) ЛОЖКА- помнишь из матрицы )))
какое-то понимание нащупывается, но пока неосознанное, хотелось бы реальное применение увидеть... по мне и птицу можно описать обычным базовым классом - не применяя слова абстракт. хотелось бы нащупать ту золотую середину понимания - где применять - чтоб не пустая трата времени, а острая необходимость.. просто для меня - базовый класс - это и есть абстракция по отношения к дочернему классу
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
для работы с зенкой для написания снипетов это все ненужно) А если ты решил достичь уровня сенсей то тогда это обязательно тебе нужно )
но в том то и вопрос - зачем абстракция - которая не содержит реализации, всё равно же потом надо писать этот метод, какая польза от абстракции?
Ну к примеру абстрактный класс может наследоваться от обычного класса где уже есть реализованные методы! )
Походу чтото не то читаешь раз такие мысли посещают )
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 228
Благодарностей
784
Баллы
113
да можно использовать и обычные методы, но в том то и вопрос - зачем абстракция - которая не содержит реализации, всё равно же потом надо писать этот метод, какая польза от абстракции? (я не говорю про обычные методы в абстрактных классах).. зачем тратить время на написание абстрактного класса - если работаешь один? что даёт - какие преимущества в использовании слова "абстракт" и методов без реализации - насколько мне известно - от абстрактного класса нельзя создавать объекты и обязательно надо переопределить абстрактные члены... я не говорю же, что не нужна абстракция в классах, но "абстрактным" по сути может быть любой обычный базовый класс - без использования слова - абстракт. Примерно такое же ощущение интерфейсов - не совсем понятно для чего что-то писать дважды - если можно сразу писать программу.. вот и прошу пояснить простым языком - какая польза от абстрактных членов - кроме напоминания что их нужно создать в производном классе, просто когда пишешь один - то зачем тебе самому себе напоминать)) это примерно так - я собрал в голове алгоритм - и начинаю с того, что пишу не рабочий код, а напоминания для рабочего кода. Может это востребовано когда программы сильно большие? нет до конца у меня понимания - вот и спрашиваю - какая практическая польза, на наглядном примере из жизни - где нельзя обойтись обычным базовым классом?
ИМХО львиная доля того, что есть в ООП C#, применима лишь при разработке больших, сложных проектов в команде. Если разрабатываешь один для себя, а тем более в рамках Zenno - этого нечего не требуется и толк от использования нулевой. Ну знать такие вещи и примерно понимать работу хотя бы теоретически все таки нужно. С чужим кодом так и так придется сталкиваться время от времени
 
  • Спасибо
Реакции: arhip1985

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Ну к примеру абстрактный класс может наследоваться от обычного класса где уже есть реализованные методы! )
то что, что то можно - я читал)) а вот - где без этого не обойтись - я не вник до конца
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
а вот - где без этого не обойтись - я не вник до конца
ну на то он и C#, что вариантов написания кода очень много, а вот написание не гу@мно кода очень мало)))
вот простой пример для чего это применять
https://www.youtube.com/Tv#/watch/video/control?v=XS2VGRwOucw&resume
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
ну на то он и C#, что вариантов написания кода очень много, а вот написание не гу@мно кода очень мало)))
вот простой пример для чего это применять
https://www.youtube.com/Tv#/watch/video/control?v=XS2VGRwOucw&resume
))) повеселил.. ну и что ты хотел этим видео сказать?)) я знаю как создаются абстрактные классы.. ты мне объясни - если ты смотрел видео - для чего мы создали абстрактный класс, а не сразу создали класс плэейр? миную абстракцию? - для чего эти лишние движения для такого простого куска кода?))) или второй вариант - для чего класс обжект мы сделали абстрактным, а не обычным базовым с виртуальным методом - я про это
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
ИМХО львиная доля того, что есть в ООП C#, применима лишь при разработке больших, сложных проектов в команде. Если разрабатываешь один для себя, а тем более в рамках Zenno - этого нечего не требуется и толк от использования нулевой. Ну знать такие вещи и примерно понимать работу хотя бы теоретически все таки нужно. С чужим кодом так и так придется сталкиваться время от времени
примерно так я и думал (про командную работу)... просто когда изучаешь - возникают вопросы - а где мне это может пригодится, в какой такой логике мне не будет хватать классов со словом абстракт... а таких примеров не раскрывают, говорят - что можно так, а где конкретно без этого не обойтись или с этим проще непонятно.. иногда смотришь - и видишь в этом только лишние движения и в пустую потраченное время, приходится самому додумывать - где бы это могло пригодится, и кроме командной работы - больше и негде получается
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
для чего эти лишние движения для такого простого куска кода?)))
это как раз и был простой пример, поэтому и код там такой простой!
- для чего мы создали абстрактный класс, а не сразу создали класс плэейр?
ну и что ты потом для каждого плеера будешь лепить свой код? А если у тебя 100500 плееров будет? и ты все в одну кучу лепить будешь? Абстрактный класс может еще наследовать кучу своих параметров от другого класса, а у плееров могут быть еще свои методы.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
ну и что ты потом для каждого плеера будешь лепить свой код? А если у тебя 100500 плееров будет? и ты все в одну кучу лепить будешь? А каждый отдельный класс плеер может еще наследовать кучу своих параметров от других классов.
в твоём примере - класс плэер унаследовл только - обязательство создания метода.. вот и какая польза от этого обязательства - просто как - напоминание, что обязательно надо создать одноимённый метод? польза была бы только если унаследована - реализация - тогда да, сокращается время на написание такого же кода...
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
ИМХО львиная доля того, что есть в ООП C#, применима лишь при разработке больших, сложных проектов в команде. Если разрабатываешь один для себя, а тем более в рамках Zenno - этого нечего не требуется и толк от использования нулевой. Ну знать такие вещи и примерно понимать работу хотя бы теоретически все таки нужно. С чужим кодом так и так придется сталкиваться время от времени
Не правда, абстрактные классы любой нормальный фрилансер использует в программах (тут конечно не идет речь о зеннолабе, в котором логика строится на последовательных действиях).
Например, реализую я класс абстрактный класс корабля. И наследую от него несколько классов: боевой корабль, грузовой корабль и корабль для перевозки людей. В абстрактном классе я могу создать обычный метод, который будет характеризовать движение корабля, а также абстрактный метод, который будет считать перевозимую массу. А в наследуемых классах реализую эти методы по расчету перевозимой массы. Теперь если мне понадобится изменить метод движения (общий для всех кораблей), то я просто изменяю этот метод в абстрактном классе.
А если бы я реализовывал все через интерфейсы, мне бы пришлось менять эту логику в 3 классах.
Также я могу все корабли привести к типу абстрактного класса, а потом задать метод, который будет принимать корабль заданного типа. Абстракция сама по себе подразумевает что-то общее для всех наследуемых типов, которое можно поместить в 1 класс и не мучиться потом при редактировании этого класса. Можно вообще пользоваться только интерфейсами, но тебе разве понравится каждый раз менять в наследуемых классах логику. Ладно если их парочку, а если их штук 20 различных, то ты сильно пожалеешь, что сразу не использовал абстрактный класс.
P.S.: сам по себе абстрактный класс без указания общей реализации бесполезен, как таковой. Для этого есть интерфейсы.
 
  • Спасибо
Реакции: arhip1985 и masterLomaster

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
Не правда, абстрактные классы любой нормальный фрилансер использует в программах (тут конечно не идет речь о зеннолабе, в котором логика строится на последовательных действиях).
Например, реализую я класс абстрактный класс корабля. И наследую от него несколько классов: боевой корабль, грузовой корабль и корабль для перевозки людей. В абстрактном классе я могу создать обычный метод, который будет характеризовать движение корабля, а также абстрактный метод, который будет считать перевозимую массу. А в наследуемых классах реализую эти методы по расчету перевозимой массы. Теперь если мне понадобится изменить метод движения (общий для всех кораблей), то я просто изменяю этот метод в абстрактном классе.
А если бы я реализовывал все через интерфейсы, мне бы пришлось менять эту логику в 3 классах.
Также я могу все корабли привести к типу абстрактного класса, а потом задать метод, который будет принимать корабль заданного типа. Абстракция сама по себе подразумевает что-то общее для всех наследуемых типов, которое можно поместить в 1 класс и не мучиться потом при редактировании этого класса. Можно вообще пользоваться только интерфейсами, но тебе разве понравится каждый раз менять в наследуемых классах логику. Ладно если их парочку, а если их штук 20 различных, то ты сильно пожалеешь, что сразу не использовал абстрактный класс.
P.S.: сам по себе абстрактный класс без указания общей реализации бесполезен, как таковой. Для этого есть интерфейсы.
а почему бы просто не создать базовый (без слова абстракт) класс - который и будет абстракцией, просто без членов с пометкой абстракт, а с обычными и виртуальными к примеру... , а те что требуются, но нет в базовом - добавлять в конкретных классах по необходимости. - в чём разница? это как считать в уме (знать что после наследования от базового надо добавить методы, которые и сам знаешь какие) и на палочках (будет показывать ошибку, пока не создашь реализацию абстрактных членов)
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
тут конечно не идет речь о зеннолабе, в котором логика строится на последовательных действиях
в зеннопостере - есть общий код, и там можно применить - если потребуется - например при командной работе над проектом, или как тз для исполнителя - заказчик описал абстрактные классы и дал команду создавать наследников - таких и таких. а другому дал команду - соединить в последовательность действий - создание объектов, запуск методов и тд. общий код зеннопостера ничем не отличается от программирования вне зеннопостера..
но в чём то, стало доходить до меня побольше, и оседает уже поглубже
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
P.S.: сам по себе абстрактный класс без указания общей реализации бесполезен, как таковой. Для этого есть интерфейсы.
Это вообще повеселило)) ты как бы подтвердил мои слова, что всё что помечено словом абстракт - бесполезно, и отсюда вытекает - что для бесполезного - есть интерфейсы - и отсюда - интерфейсы так же бесполезны))).. моя точка зрения не поменялась пока - она до сих пор вопросительная, но тем не менее, отложилось, что - при работе над большими проектами - важность напоминаний создания реализации абстрактных членов - высока. а создать абстракцию можно и без слова - абстракт, просто члены, которые отличны - будут либо переопределять виртуальный метод, либо держатся в уме.
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 311
Благодарностей
1 191
Баллы
113
Это вообще повеселило)) ты как бы подтвердил мои слова, что всё что помечено словом абстракт - бесполезно, и отсюда вытекает - что для бесполезного - есть интерфейсы - и отсюда - интерфейсы так же бесполезны))).. моя точка зрения не поменялась пока - она до сих пор вопросительная, но тем не менее, отложилось, что - при работе над большими проектами - важность напоминаний создания реализации абстрактных членов - высока. а создать абстракцию можно и без слова - абстракт, просто члены, которые отличны - будут либо переопределять виртуальный метод, либо держатся в уме.
Я же тебе привел пример кода, в котором ясно видно, что внутри абстрактного класса можно напрямую создать логику, которая будет использоваться во всех наследуемых классах и в этих наследуемых классах её не надо будет задавать, так как она есть в главном абстрактном классе.
Другими словами, в абстрактном классе помимо абстрактных методов есть и обычные методы, которые уже содержат готовую реализацию для всех других классов, которые будут от него наследоваться.
Класс помечают словом abstract, чтобы никто не умудрился создавать его объект, так как это бесполезно.
 
Последнее редактирование:
  • Спасибо
Реакции: masterLomaster
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
Я же тебе привел пример кода, в котором ясно видно, что внутри абстрактного класса можно напрямую создать логику, которая будет использоваться во всех наследуемых классах и в этих наследуемых классах её не надо будет задавать, так как она есть в главном абстрактном классе.
Другими словами, в абстрактном классе помимо абстрактных методов есть и обычные методы, которые уже содержат готовую реализацию для всех других классов, которые будут от него наследоваться.
Класс помечают словом abstract, чтобы никто не умудрился создавать его объект, так как это бесполезно.
в общем пока он сам не столкнется то не поймет! Я более доходчиво чем ты объяснить не смог )))
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
1. Я же тебе привел пример кода, в котором ясно видно, что внутри абстрактного класса можно напрямую создать логику, которая будет использоваться во всех наследуемых классах и в этих наследуемых классах её не надо будет задавать, так как она есть в главном абстрактном классе.
Другими словами, в абстрактном классе помимо абстрактных методов есть и обычные методы, которые уже содержат готовую реализацию для всех других классов, которые будут от него наследоваться.
2. Класс помечают словом abstract, чтобы никто не умудрился создавать его объект, так как это бесполезно.
я дотошный просто)) понимаю про что ты говоришь, но тем не менее, пометил твоё сообщение единицей и двойкой, по соответствию хочу уточнить:
1. твой пример кода можно было бы реализовать обычным базовым классом, а детей создавать со своими доп методами и тд.
2. пишу я такой сам по себе код - и ни с того ни с сего не понимаю от каких классов мне надо создавать объект?)) ты серьёзно? - или это всё-таки для командой работы?, а не практическая необходимость..
 
Регистрация
08.07.2015
Сообщения
2 848
Благодарностей
712
Баллы
113
- или это всё-таки для командой работы?
вот реально вся проблема в том что тебе ктото ляпнул что это для командной работы ты теперь и всех остальных пытаешься в этом убедить! Для командной работы есть DLL так если что!
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
вот реально вся проблема в том что тебе ктото ляпнул что это для командной работы ты теперь и всех остальных пытаешься в этом убедить! Для командной работы есть DLL так если что!
мне никто не ляпал, я в первом посте изложил своё предположение, следи за руками)) при чём тут длл??)) эх ломастер, понимал бы ты про что мы тут говорим, ты бы так не отписывался, жаль что ты не докапываешься до сути... а сразу пытаешься всё опровергнуть, при чём без основательно. я же конкретно вопросы ставлю, а ответы получаю отвлечённые)) но дискуссия продолжается, интересно до чего дойдём, пока остановились и даже после твоего сообщения не сдвинулись с места - вот этого хотябы:
я дотошный просто)) понимаю про что ты говоришь, но тем не менее, пометил твоё сообщение единицей и двойкой, по соответствию хочу уточнить:
1. твой пример кода можно было бы реализовать обычным базовым классом, а детей создавать со своими доп методами и тд.
2. пишу я такой сам по себе код - и ни с того ни с сего не понимаю от каких классов мне надо создавать объект?)) ты серьёзно? - или это всё-таки для командой работы?, а не практическая необходимость..
хотя раньше я уже об этом и говорил
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)