Сохранен 50
https://2ch.hk/b/res/186912749.html
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

ИТТ призываю гуру и не очень C#. Ведь только в

 Аноним 21/11/18 Срд 11:36:31 #1 №186912749 
image.png
ИТТ призываю гуру и не очень C#. Ведь только в /b/ сидят гуру всея программирования мира и фрилансеры 300ккк/наносек В /pr/ полтора анона . Двощ, такие дела. Начал вкатываться в сисярп. Прошел на метаните курс вплоть до практики, взял отпуск на время ремонта месяц, сейчас повторяю пройденный материал, чтоб допереть до тех вещей, до которых раньше не допер, да и просто лучше разобраться. Но встал вопрос-преобразование объектов классов. Прошарил первые 5 страниц гугла и так внятного ответа не нашел-зачем, почему и как. Для более простого пояснения приведу кусок кода. Совственно вопросы:
1)Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый
2)При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будетна форумах походу поехавшие, т.к там говорят и то и другое?
3)За каким хером мне вообще может понадобиться нисходящее преобразование, да и к тому же при таком преобразовании нередко еще и ошибки возникают. Че за нах?
4)Объект производного класса так же является объектом базового. А наоборот разве это не работает?
Код будет в самом треде+доп. вопросы. Только вы, анончики, сможете помочь мне. На вопросы-а почему, а нахуя учить, а как же питон?-сисярп сука сложно, сука мозг горит, но почему-то нраица очинь. По-этому и хочу именно разобраться в той хуйне, что там твориться, чтоб понимать сам язык, а не пролистать метанит и говорить всем, шо я у бабы сраки прогромммиииизд.
Так же реквестирую годные ресурсы по этому языку на русском, т.к. ангельский только технический, и ничего сложнее сервис мануала осилить не могу.
Аноним 21/11/18 Срд 11:37:47 #2 №186912802 
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;
}
}
Аноним 21/11/18 Срд 11:45:22 #3 №186913081 
Вот такой вот пример на метаните.

Person person = new Client("Sam", "ContosoBank");
// преобразование от типа Person к Client
Client client = (Client)person;

Тип показывают, как нисходящее преобразование явно написать.
Но дальше идет следующее

Person person = new Person("Bob");
Employee emp2 = (Employee) person; // ! Ошибка
Тут впринципе тоже самое, но ВТФ какая нах ошибка.

Комментарий от метанита-В данном случае мы пытаемся преобразовать объект типа Person к типу Employee, а объект Person не является объектом Employee.

Ну и зачем же было до этого писать тип так преобразовывать и надо, а потом писать, что так преобразовать не получится. Запутался, разъясните плиз
Аноним 21/11/18 Срд 11:55:14 #4 №186913455 
изображение.png
>>186913081
ну че ты.
и Employee и Client являются Person.

но Employee не является Client, поэтому нихуя нельзя приводить и не то же самое
Аноним 21/11/18 Срд 11:59:41 #5 №186913624 
>>186912749 (OP)
Жаба макака врывается в этот итт тред
Ты можешь объявить объект типа родительского класса, но на самом деле положить внутрь объект дочернего класса. Тогда у тебя будет возможность обратиться к полям/методам только родительского класса, несмотря на то, что по факту это объект дочернего класса. Чтобы обратиться к полям/методам дочернего класса из объекта, тип которого родитель - нужно сделать явное указание, типа (имядочернегокласса) объектродительского. Это указание нужно интерпретатору, ты ему как бы говоришь что ты точно знаешь что лежит внутри и как с этим работать.
Ну в жабе так, и в шарпах вроде как тоже. Лучше всего открой дебаггер и посмотри как и что у тебя лежит
Аноним 21/11/18 Срд 12:02:20 #6 №186913730 
>>186913455
Ну так Employee я привожу не в Client, а в Person. В первом случает от базового Person в наследник Client, а во втором от базового Person в наследник Employee. В первом работает, а во втором нет, или я что-то упускаю?
Аноним 21/11/18 Срд 12:05:56 #7 №186913896 
>>186913624
Вот я и спрашиваю, где это может пригодиться, в каких ситуациях, потому что, например, для сложения 2х свойств объектов дочернего и родительского класса я просто могу сделать перегрузку оператора +, а зачем мне нужно будет именно приводить выше или ниже переменную, я не понимаю, потому что не знаю, где это пригодится.
Аноним 21/11/18 Срд 12:08:46 #8 №186914024 
>>186913730
>Person person = new Person("Bob");
>Employee emp2 = (Employee) person; // ! Ошибка

ты пытаешься привести Person к Employee.
Employee является наследником Person.
У Employee может быть дополнительный функционал, которого не было в Person.
Поэтому Person не является Employee.
Поэтому так приводить нельзя
Аноним 21/11/18 Срд 12:10:09 #9 №186914081 
>>186913896
Для написания унифицированных методов, где на вход будут поступать только объекты родители, а уже в теле метода ты сможешь хуевертить их как захочешь, в том числе чекать, является ли объект на входе объектом дочернего класса, сделать явное кастование, и работать с ним как с дочерним
Аноним 21/11/18 Срд 12:10:26 #10 №186914096 
>>186912749 (OP)
Долбоебина, открывай книжку ООП и возвращайся когда прочтешь.
Аноним 21/11/18 Срд 12:11:43 #11 №186914148 
>>186914024
Person person = new Client("Sam", "ContosoBank");
// преобразование от типа Person к Client
Client client = (Client)person;

тут получается тоже тогда должна быть ошибка?
Аноним 21/11/18 Срд 12:13:55 #12 №186914236 
>>186914081
>на вход будут поступать только объекты родители

>является ли объект на входе объектом дочернего класса

чет не въехал
Аноним 21/11/18 Срд 12:14:18 #13 №186914248 
>>186914096
Ну так ты скажи, какую?
Аноним 21/11/18 Срд 12:15:25 #14 №186914301 
>>186914148

фактически твой объект всегда остаётся того типа, которого ты сделал new. тоесть в данном случае типа Client.

поэтому тут все окей.
Аноним 21/11/18 Срд 12:15:27 #15 №186914305 
>>186914096
Ах да, еще-прочитать книжку по ООП и возвращаться на двощи, ахуенно
Аноним 21/11/18 Срд 12:15:57 #16 №186914330 
>>186913081
>Person person = new Person("Bob");
>Employee emp2 = (Employee) person;

Не задан параметр >string company ?

Ну точно, блджад! Первый заведомо объявляется как наследный класс, поэтому получается провести преобразование, а второй объявляется как класс-предок, поэтому не содержит нужного поля. Тоже самое при переходе
Emploee emploee=(Emploee)client;
и
Client client=(Client)emploee;

Аноним 21/11/18 Срд 12:17:37 #17 №186914405 
>>186914081
Бля, охуенно. Запомнить бы.
Аноним 21/11/18 Срд 12:20:17 #18 №186914528 
>>186914236
пишу жабастайл, не обуссудьте

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, но можешь работать с ним и как с дочерними оъектами, главное проверить что там действительно лежит наследник
Аноним 21/11/18 Срд 12:26:03 #19 №186914747 
>>186914528
Ну и естественно на вход этого метода ты можешь явно передать объект класса Employee, все будет работать
Аноним 21/11/18 Срд 12:29:15 #20 №186914895 
>>186914528
>company = person.getCompany();
company = ((Employee) person).getCompany();
небыстрофикс
Аноним 21/11/18 Срд 12:37:53 #21 №186915276 
>>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?
Аноним 21/11/18 Срд 12:39:05 #22 №186915319 
>>186915276
Не Company Bank
самофикс
Аноним 21/11/18 Срд 12:39:57 #23 №186915359 
>>186915319
Не Company а Bank
самофикс намбер ту
Аноним 21/11/18 Срд 12:43:11 #24 №186915508 
>>186914895
т.е. ты сначала получаешь значение свойства Name, а потом хочешь получить значение свойства Company, но не можешь, т.к. в классе Person такого нет, по-этому ты просто нисходящее преобразование делаешьcompany = ((Employee) person).getCompany(); и получаешь значение это?
Аноним 21/11/18 Срд 12:50:23 #25 №186915821 
>>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
}
класс Говно : Внутрижопный_обьект {
риальне Пахучесть;
}

Тогда в такой схеме в жопу можно вложить как бутылку с посланием, так и говно. Жопа не знает, что находится внутри нее, она считает, что это просто объект класса Внутрижопный_Обьект. Тем не менее, бутылка, являясь внутрижопным объектом, не теряет своих свойств и записки внутри, что очень логично.

Аноним 21/11/18 Срд 13:00:45 #26 №186916308 
>>186915821
Ух бля, оподливился с этого описания. Спасибо анонче, почему-то на примере жопы и говна понимается куда легче. Ты сделал меня немного умнее, теперь чуть больше понял. Если бы ты смог в похожем стиле ответить на воросы из оп-поста, был бы очень благодарен тебе, но и на этом огромное спасибо тебе.
Аноним 21/11/18 Срд 13:16:04 #27 №186916931 
Console.WriteLine("Bump");
Аноним 21/11/18 Срд 13:30:51 #28 №186917503 
И снова бамп
(где-то 40 мин не будет меня, с работы до дома добираться буду)
Аноним 21/11/18 Срд 13:46:38 #29 №186918225 
>>186912749 (OP)
>Для чего мне нужно будет преобразовывать объект производного типа в базовый
Чтобы можно было работать с любым объектами, производными от этого. Например, чтобы ты мог из какой-нибудь
FooBar(Person p)
{
p.Display();
};
Enployee e;
сделать
FooBar(e) или FooBar((Person)e), не помню точно

Короче, для работы с полиморфизмом.

>А наоборот разве это не работает?
А как ты себе представляешь обращение к Company у Perosn у него этого нет

Но в теории можно сделать что-то вроде
Employee(Perosn p)
{
Name = p.name
Company = "";
}

Но не уверен, сможет ли оно неявно преобразовать.
Аноним 21/11/18 Срд 13:52:12 #30 №186918481 
>>186915821
> абстрактный класс Внутрижопный_обьект
а ещё лучше бы
> интерфейс ИВнутрижопный_обьект
Аноним 21/11/18 Срд 13:53:22 #31 №186918541 
>>186918481
>класс Внутрижопный_обьект {
>риальне Диаметр;
>}

>риальне Диаметр;

>а ещё лучше бы интерфейс
Мда.
Аноним 21/11/18 Срд 14:02:59 #32 №186918960 
>>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)Объект производного класса так же является объектом базового. А наоборот разве это не работает?
Нет. Содержимое очка может являться и не бутылкой, и не говном, а например хуем лучшего друга, нутыпонел.
> Код будет в самом треде+доп. вопросы. Только вы, анончики, сможете помочь мне. На вопросы-а почему, а нахуя учить, а как же питон?-сисярп сука сложно, сука мозг горит, но почему-то нраица очинь. По-этому и хочу именно разобраться в той хуйне, что там твориться, чтоб понимать сам язык, а не пролистать метанит и говорить всем, шо я у бабы сраки прогромммиииизд.
> Так же реквестирую годные ресурсы по этому языку на русском, т.к. ангельский только технический, и ничего сложнее сервис мануала осилить не могу.
Аноним 21/11/18 Срд 14:10:45 #33 №186919351 
>>186918960
спасибо, Анонче, на примере жопы и говна всё доступно объяснил, даже въезжаю в эту хуету. Надеюсь пойймать тебя в следующих подобных тредах, которые я буду создавать по мере углубления в канализацию
Аноним 21/11/18 Срд 14:17:27 #34 №186919670 
Сколько времени ты потратил на прохождение до практики?
Аноним 21/11/18 Срд 14:25:03 #35 №186920055 
>>186919670
Не знаю, месяц-полтора(в свободное от работы время на работе учил, т.е. часа по 2-3 5 дней в неделю). Сидел, разбирался. Основы вообще изи, дальше начал мозг напрягать.
Аноним 21/11/18 Срд 14:27:12 #36 №186920166 
>>186920055
Да я просто сейчас тем же самым занимаюсь, пока только 4 главу прошёл. Интересно сколько примерно часов надо, что бы пройти большую часть уроков на метаните
Аноним 21/11/18 Срд 14:28:32 #37 №186920239 
>>186920166
Ну так я не сильно старался разобраться в том, что вообще не понял. Это я оставил на повторение.
Аноним 21/11/18 Срд 14:35:22 #38 №186920596 
>>186912749 (OP)
Ебать, ты просто не можешь понять базовые принципы ООП, и сыпешь долбоёбскими вопросами

> Зачем восходящие преобразования? Для чего мне нужно будет преобразовывать объект производного типа в базовый
К примеру у тебя есть экземпляр Клиент и экземпляр Работник. И есть какой-нибудь класс, типа Больничка, с методом ЗаписатьНаПриём. Зачем тебе делать два одинаковых метода, отдельные для Клиента и Работника, если тебе по сути записать надо Человека, который базовый для Клиента и Работника?
> При восходящем преобразовании функционал, который определен только в классе-наследнике, не будет доступен или всё-таки будет
Если ты приведёшь к классу-наследнику экземпляр, который точно наследник - то доступен будет, но это тоже говнокод
> За каким хером мне вообще может понадобиться нисходящее преобразование
Ни за каким, такое понадобится только в лютом говнокоде, который нарушает принцип инверсии зависимостей.
> Объект производного класса так же является объектом базового. А наоборот разве это не работает?
Нет, не работает. Объект Человек может и не быть Работником. Может он РНН-кун, например.

Вообще, ты бы хоть почитал что-нибудь базовое по ООП, потом почитал про SOLID/STUPID-код, потом про паттерны проектирования. Ну и по актуальных архитектурам чего. Пока что у тебя абсолютно никакое понимание базовых частей ООП и принципов SOLID.
Аноним 21/11/18 Срд 14:40:36 #39 №186920907 
>>186920596
Ну так посоветуй мне. Написал же, что реквестирую годные ресурсы. Для тебя мб это и долбоебские вопросы, а я только разбираюсь в этом. Это как пиздюку из 5В сказать, что он сыплет долбоебскими вопросами, когда спрашивает, как находить ассимптоты при исследовании графика функции и зачем вообще они нужны.
Аноним 21/11/18 Срд 14:44:37 #40 №186921148 
>>186920907
Главное - понять, что язык программирования - вторичен.

По ООП - бери любую книгу, на самом деле. Лучше даже две любых книги.
По паттернам - классика, банда четырёх «Приёмы объектно-ориентированного проектирования. Паттерны проектирования».
По SOLID/STUPID-коду - статьи в википедии хватит для начала, потом на Хабре почитай, там были годные статьи.
Аноним 21/11/18 Срд 15:06:24 #41 №186922234 
>>186914081
Ебобо
Аноним 21/11/18 Срд 15:09:54 #42 №186922393 
>>186922234
А почему?
Аноним 21/11/18 Срд 15:10:59 #43 №186922446 
>>186922393
Потому что говнокод же.
Аноним 21/11/18 Срд 15:12:27 #44 №186922525 
>>186922446
ну я из говнокода только индийский знаю, в котором всякой хуйни левой полно. Есть хорошее пособие по хорошему коду с доступным объяснением?
Аноним 21/11/18 Срд 15:13:28 #45 №186922570 
>>186922525
Выше уже отвечали же. >>186921148>>186920596
Аноним 21/11/18 Срд 15:16:30 #46 №186922704 
>>186922570
Но ничего конкретного, кроме банды четырех по паттернам, не скинули.
Аноним 21/11/18 Срд 15:18:33 #47 №186922797 
>>186922704
Ну если проблемы с базовым пониманием ООП - тут любой учебник по ООП подойдет. На тпрогере есть даже что-то типа "3 лучших учебника по ООП".
По SOLID - статья в википедии и ссылки на все пять принципов - вполне кликабельны, и написано вменяемо. За остальным - гуглить статьи на хабре. Неужели это так сложно?
Или вам пока название книги не дашь - вы ничего и не прочитаете, и будете кидаться говном "ой на двоще опять в гугл послали"?
Аноним 21/11/18 Срд 15:34:10 #48 №186923590 
>>186922797
Вот теперь ты указал конкретнее куда рыть. Спасибо. Хотя никогда не думал, что википедией можно пользоваться, чтоб разобраться в материале, а не просто прочитать хуету, которую забудешь завтра.
Аноним 21/11/18 Срд 15:37:48 #49 №186923795 
>>186922797
кстати, какой ресурс по базовому пониманию ООП ты сам можешь порекомендовать?
Аноним 21/11/18 Срд 15:56:48 #50 №186924691 
>>186923795
Сейчас даже и не подскажу, я ООП изучал в нулевых, не помню по каким учебникам и статьям. Сейчас не слежу за ними, потому что нет надобности. В мире ООП ничего не поменялось.
comments powered by Disqus

Отзывы и предложения