ИТТ призываю гуру и не очень C#. Ведь только в /b/ сидят гуру всея программирования мира и фрилансеры 300ккк/наносек В /pr/ полтора анона . Двощ, такие дела. Начал вкатываться в сисярп. Прошел на метаните курс вплоть до практики, взял отпуск на время ремонта месяц, сейчас повторяю пройденный материал, чтоб допереть до тех вещей, до которых раньше не допер, да и просто лучше разобраться. Но встал вопрос-преобразование объектов классов. Прошарил первые 5 страниц гугла и так внятного ответа не нашел-зачем, почему и как. Для более простого пояснения приведу кусок кода. Совственно вопросы: 1)Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый 2)При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будетна форумах походу поехавшие, т.к там говорят и то и другое? 3)За каким хером мне вообще может понадобиться нисходящее преобразование, да и к тому же при таком преобразовании нередко еще и ошибки возникают. Че за нах? 4)Объект производного класса так же является объектом базового. А наоборот разве это не работает? Код будет в самом треде+доп. вопросы. Только вы, анончики, сможете помочь мне. На вопросы-а почему, а нахуя учить, а как же питон?-сисярп сука сложно, сука мозг горит, но почему-то нраица очинь. По-этому и хочу именно разобраться в той хуйне, что там твориться, чтоб понимать сам язык, а не пролистать метанит и говорить всем, шо я у бабы сраки прогромммиииизд. Так же реквестирую годные ресурсы по этому языку на русском, т.к. ангельский только технический, и ничего сложнее сервис мануала осилить не могу.
class Person { public string Name { get; set; } public Person(string name) { Name = name; } public void Display() { Console.WriteLine($"Person {Name}"); } }
class Employee : Person { public string Company { get; set; } public Employee(string name, string company) : base(name) { Company = company; } }
class Client : Person { public string Bank { get; set; } public Client(string name, string bank) : base(name) { Bank = bank; } }
>>186912749 (OP) Жаба макака врывается в этот итт тред Ты можешь объявить объект типа родительского класса, но на самом деле положить внутрь объект дочернего класса. Тогда у тебя будет возможность обратиться к полям/методам только родительского класса, несмотря на то, что по факту это объект дочернего класса. Чтобы обратиться к полям/методам дочернего класса из объекта, тип которого родитель - нужно сделать явное указание, типа (имядочернегокласса) объектродительского. Это указание нужно интерпретатору, ты ему как бы говоришь что ты точно знаешь что лежит внутри и как с этим работать. Ну в жабе так, и в шарпах вроде как тоже. Лучше всего открой дебаггер и посмотри как и что у тебя лежит
>>186913455 Ну так Employee я привожу не в Client, а в Person. В первом случает от базового Person в наследник Client, а во втором от базового Person в наследник Employee. В первом работает, а во втором нет, или я что-то упускаю?
>>186913624 Вот я и спрашиваю, где это может пригодиться, в каких ситуациях, потому что, например, для сложения 2х свойств объектов дочернего и родительского класса я просто могу сделать перегрузку оператора +, а зачем мне нужно будет именно приводить выше или ниже переменную, я не понимаю, потому что не знаю, где это пригодится.
>>186913730 >Person person = new Person("Bob"); >Employee emp2 = (Employee) person; // ! Ошибка
ты пытаешься привести Person к Employee. Employee является наследником Person. У Employee может быть дополнительный функционал, которого не было в Person. Поэтому Person не является Employee. Поэтому так приводить нельзя
>>186913896 Для написания унифицированных методов, где на вход будут поступать только объекты родители, а уже в теле метода ты сможешь хуевертить их как захочешь, в том числе чекать, является ли объект на входе объектом дочернего класса, сделать явное кастование, и работать с ним как с дочерним
>>186913081 >Person person = new Person("Bob"); >Employee emp2 = (Employee) person;
Не задан параметр >string company ?
Ну точно, блджад! Первый заведомо объявляется как наследный класс, поэтому получается провести преобразование, а второй объявляется как класс-предок, поэтому не содержит нужного поля. Тоже самое при переходе Emploee emploee=(Emploee)client; и Client client=(Client)emploee;
public void doSmth(Person person) { String name = person.getName();// ok String company; company = person.getCompany(); // could be ok if (person instanceof Employee) { company = person.getCompany(); // 100% ok } }
В итоге ты как бы передаёшь в метод объект класса Person, но можешь работать с ним и как с дочерними оъектами, главное проверить что там действительно лежит наследник
>>186914301 Person person = new Client("Sam", "ContosoBank"); Тут я получается преобразую Client в Person/ Получается, что при этом мне из переданных в конструктор данных доступно только свойство Name,т.е. я могу Console.Write(person.Name)Sam, но не могу Console.Write(person.Company).Но если я cделаю Client client = (Client)person, то тогда я смогу Console.Write(client.Name)Sam и Console.Write(client.Company)ContosoBank или значение свойства Company проебалось и будет null?
>>186914895 т.е. ты сначала получаешь значение свойства Name, а потом хочешь получить значение свойства Company, но не можешь, т.к. в классе Person такого нет, по-этому ты просто нисходящее преобразование делаешьcompany = ((Employee) person).getCompany(); и получаешь значение это?
>>186915276 > Person person = new Client("Sam", "ContosoBank"); Тут я получается преобразую Client в Person/ Получается, что при этом мне из переданных в конструктор данных доступно только свойство Name,т.е. я могу Console.Write(person.Name)Sam, но не могу Console.Write(person.Company).Но если я cделаю Client client = (Client)person, то тогда я смогу Console.Write(client.Name)Sam и Console.Write(client.Company)ContosoBank или значение свойства Company проебалось и будет null? Ничо не проебется, ты хранишь по ссылке person объект класса Client. Представь следующее. класс Жопа { Внутрижопный_обьект содержимое_очка; } класс Внутрижопный_обьект { риальне Диаметр; } класс Бутылка : Внутрижопный_обьект { строка Послание_Потомкам; // ну тип записку в бутыль положили)))00 } класс Говно : Внутрижопный_обьект { риальне Пахучесть; }
Тогда в такой схеме в жопу можно вложить как бутылку с посланием, так и говно. Жопа не знает, что находится внутри нее, она считает, что это просто объект класса Внутрижопный_Обьект. Тем не менее, бутылка, являясь внутрижопным объектом, не теряет своих свойств и записки внутри, что очень логично.
>>186915821 Ух бля, оподливился с этого описания. Спасибо анонче, почему-то на примере жопы и говна понимается куда легче. Ты сделал меня немного умнее, теперь чуть больше понял. Если бы ты смог в похожем стиле ответить на воросы из оп-поста, был бы очень благодарен тебе, но и на этом огромное спасибо тебе.
>>186912749 (OP) >Для чего мне нужно будет преобразовывать объект производного типа в базовый Чтобы можно было работать с любым объектами, производными от этого. Например, чтобы ты мог из какой-нибудь FooBar(Person p) { p.Display(); }; Enployee e; сделать FooBar(e) или FooBar((Person)e), не помню точно
Короче, для работы с полиморфизмом.
>А наоборот разве это не работает? А как ты себе представляешь обращение к Company у Perosn у него этого нет
Но в теории можно сделать что-то вроде Employee(Perosn p) { Name = p.name Company = ""; }
>>186912749 (OP) > ИТТ призываю гуру и не очень C#. Ведь только в /b/ сидят гуру всея программирования мира и фрилансеры 300ккк/наносек В /pr/ полтора анона . Двощ, такие дела. Начал вкатываться в сисярп. Прошел на метаните курс вплоть до практики, взял отпуск на время ремонта месяц, сейчас повторяю пройденный материал, чтоб допереть до тех вещей, до которых раньше не допер, да и просто лучше разобраться. Но встал вопрос-преобразование объектов классов. Прошарил первые 5 страниц гугла и так внятного ответа не нашел-зачем, почему и как. Для более простого пояснения приведу кусок кода. Совственно вопросы: > 1)Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый Чтобы хранить в жопе бутылку или говно, неважно. Немного неудобно в жопе создать переменные и для бутылки, и для жопы, да и вместимость пусть будет лишь один предмет. > 2)При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будетна форумах походу поехавшие, т.к там говорят и то и другое? Функционал можно получить, если обращаться вот так ((бутылка)внутрижопный_обьект).Метод > 3)За каким хером мне вообще может понадобиться нисходящее преобразование, да и к тому же при таком преобразовании нередко еще и ошибки возникают. Че за нах? Ну, например, пишешь ты метод для жопы: void ВысратьСодержимое(){ if (содержимое_очка is Бутылка) Console.Writeline( (содержимое_очка as Бутылка).Послание_Потомкам ); else if (содержимое_очка is Говно) { if ( (содержимое_очка as Говно).Пахучесть > 0f ) Console.Writeline ("НАЧАЛЬНИК! ЭТОТ ПИДОРАС ОБОСРАЛСЯ, БЛЯ!"); } Содержимое жопы не известно заранее, но можно проверить и привести к известному, а потом уже использовать как объект более специализированного класса. > 4)Объект производного класса так же является объектом базового. А наоборот разве это не работает? Нет. Содержимое очка может являться и не бутылкой, и не говном, а например хуем лучшего друга, нутыпонел. > Код будет в самом треде+доп. вопросы. Только вы, анончики, сможете помочь мне. На вопросы-а почему, а нахуя учить, а как же питон?-сисярп сука сложно, сука мозг горит, но почему-то нраица очинь. По-этому и хочу именно разобраться в той хуйне, что там твориться, чтоб понимать сам язык, а не пролистать метанит и говорить всем, шо я у бабы сраки прогромммиииизд. > Так же реквестирую годные ресурсы по этому языку на русском, т.к. ангельский только технический, и ничего сложнее сервис мануала осилить не могу.
>>186918960 спасибо, Анонче, на примере жопы и говна всё доступно объяснил, даже въезжаю в эту хуету. Надеюсь пойймать тебя в следующих подобных тредах, которые я буду создавать по мере углубления в канализацию
>>186919670 Не знаю, месяц-полтора(в свободное от работы время на работе учил, т.е. часа по 2-3 5 дней в неделю). Сидел, разбирался. Основы вообще изи, дальше начал мозг напрягать.
>>186920055 Да я просто сейчас тем же самым занимаюсь, пока только 4 главу прошёл. Интересно сколько примерно часов надо, что бы пройти большую часть уроков на метаните
>>186912749 (OP) Ебать, ты просто не можешь понять базовые принципы ООП, и сыпешь долбоёбскими вопросами
> Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый К примеру у тебя есть экземпляр Клиент и экземпляр Работник. И есть какой-нибудь класс, типа Больничка, с методом ЗаписатьНаПриём. Зачем тебе делать два одинаковых метода, отдельные для Клиента и Работника, если тебе по сути записать надо Человека, который базовый для Клиента и Работника? > При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будет Если ты приведёшь к классу-наследнику экземпляр, который точно наследник - то доступен будет, но это тоже говнокод > За каким хером мне вообще может понадобиться нисходящее преобразование Ни за каким, такое понадобится только в лютом говнокоде, который нарушает принцип инверсии зависимостей. > Объект производного класса так же является объектом базового. А наоборот разве это не работает? Нет, не работает. Объект Человек может и не быть Работником. Может он РНН-кун, например.
Вообще, ты бы хоть почитал что-нибудь базовое по ООП, потом почитал про SOLID/STUPID-код, потом про паттерны проектирования. Ну и по актуальных архитектурам чего. Пока что у тебя абсолютно никакое понимание базовых частей ООП и принципов SOLID.
>>186920596 Ну так посоветуй мне. Написал же, что реквестирую годные ресурсы. Для тебя мб это и долбоебские вопросы, а я только разбираюсь в этом. Это как пиздюку из 5В сказать, что он сыплет долбоебскими вопросами, когда спрашивает, как находить ассимптоты при исследовании графика функции и зачем вообще они нужны.
>>186920907 Главное - понять, что язык программирования - вторичен.
По ООП - бери любую книгу, на самом деле. Лучше даже две любых книги. По паттернам - классика, банда четырёх «Приёмы объектно-ориентированного проектирования. Паттерны проектирования». По SOLID/STUPID-коду - статьи в википедии хватит для начала, потом на Хабре почитай, там были годные статьи.
>>186922446 ну я из говнокода только индийский знаю, в котором всякой хуйни левой полно. Есть хорошее пособие по хорошему коду с доступным объяснением?
>>186922704 Ну если проблемы с базовым пониманием ООП - тут любой учебник по ООП подойдет. На тпрогере есть даже что-то типа "3 лучших учебника по ООП". По SOLID - статья в википедии и ссылки на все пять принципов - вполне кликабельны, и написано вменяемо. За остальным - гуглить статьи на хабре. Неужели это так сложно? Или вам пока название книги не дашь - вы ничего и не прочитаете, и будете кидаться говном "ой на двоще опять в гугл послали"?
>>186922797 Вот теперь ты указал конкретнее куда рыть. Спасибо. Хотя никогда не думал, что википедией можно пользоваться, чтоб разобраться в материале, а не просто прочитать хуету, которую забудешь завтра.
>>186923795 Сейчас даже и не подскажу, я ООП изучал в нулевых, не помню по каким учебникам и статьям. Сейчас не слежу за ними, потому что нет надобности. В мире ООП ничего не поменялось.
1)Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый
2)При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будетна форумах походу поехавшие, т.к там говорят и то и другое?
3)За каким хером мне вообще может понадобиться нисходящее преобразование, да и к тому же при таком преобразовании нередко еще и ошибки возникают. Че за нах?
4)Объект производного класса так же является объектом базового. А наоборот разве это не работает?
Код будет в самом треде+доп. вопросы. Только вы, анончики, сможете помочь мне. На вопросы-а почему, а нахуя учить, а как же питон?-сисярп сука сложно, сука мозг горит, но почему-то нраица очинь. По-этому и хочу именно разобраться в той хуйне, что там твориться, чтоб понимать сам язык, а не пролистать метанит и говорить всем, шо я у бабы сраки прогромммиииизд.
Так же реквестирую годные ресурсы по этому языку на русском, т.к. ангельский только технический, и ничего сложнее сервис мануала осилить не могу.