Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378

Супер класс. Почему так?

03.07.2023, 11:09. Показов 1038. Ответов 10

Студворк — интернет-сервис помощи студентам
Привет народ. Помогите плиз, объясните, простыми словами в чем отличие...


Есть родительский класс Car
Есть дочерний класс Truck

в Main
C#
1
Car bmw = new Truck();
чем отличается от этого

в Main
C#
1
Truck bmw = new Truck();

Если можете объясните пожалуйста, чем проще тем лучше.
Просто не могу понять логику, в каком случае нужно прописывать
Car bmw = new Truck();, а в каком Truck bmw = new Truck(); На что это влияет?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2023, 11:09
Ответы с готовыми решениями:

Супер класс мобильный телефон задача
Создать суперкласс мобильный телефон и подклассы Nokia,Siemens,Samsung. С помощью конструктора автоматически установить Id каждого...

что лучше купить 9700к с 2060 супер или 3600 с 2070 супер?
для игрушек но вдруг потом буду стримить

Как можно узнать может ли супер класс кастануться в субкласс
В общем, у меня есть класс Диета, который состоит из Рационов, которые состоят из приемов пищи, которые состоят из продуктов и все они...

10
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,218
03.07.2023, 11:25
Мистер Джек, отличается типом переменной.
Тип переменной определяет набор доступных членов через эту переменную.
В первом случае будут доступны только публичные члены типа Car, во втором - еще добавятся члены типа Truck.
То есть, в общем случае для Truck их может быть больше.
А еще это типизация - способ для компилятора выбирать перегрузку, если есть, например, перегрузки метода, принимающего эти параметры.
1
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378
03.07.2023, 11:33  [ТС]
Простите, все равно не догоняю.

Car bmw = new Truck();
Мы используем общий класс, а выделим память под дочерний. А на практике как это? Вообще запутался....



Объясните попроще, для сверх чайников.
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,218
03.07.2023, 11:50
Знак равно в ЯП является оператором присваивания (assignment statement).
Слева от него - переменная определенного типа, которая может хранить, условно говоря, выражение (в данном случае ссылку на объект определенного типа)
Справа - грубо говоря, выражение, которое создает объект определенного типа и возвращает ссылку на него.
Таким образом происходит присваивание ссылки производного типа переменной базового типа. Почему так можно делать? - Потому что в языке C# разрешается неявное приведение переменной выражения своего типа, либо любого из производных типов.

Добавлено через 1 минуту
C#
1
2
3
4
Truck truck = new Truck();
Car bmw = new Truck();
//то же самое что и строка выше
bmw = truck;
1
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
03.07.2023, 12:34
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Просто не могу понять логику, в каком случае нужно прописывать
Car bmw = new Truck();, а в каком Truck bmw = new Truck(); На что это влияе
C#
1
2
3
4
5
6
7
8
ProcessCar(new Car()); // OK
ProcessCar(new Truck()); // OK
 
ProcessTruck(new Truck()); // OK
ProcessTruck(new Car()); // ERROR!
 
void ProcessCar(Car car) { /* ... */ }
void ProcessTruck(Truck truck) { /* ... */ }
1
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,517
Записей в блоге: 3
03.07.2023, 13:01

Не по теме:

ЧТо же будет, когда дойдете до интерфейсов...



Цитата Сообщение от Мистер Джек Посмотреть сообщение
Мы используем общий класс, а выделим память под дочерний.
выделение памяти происходит исключительно в new Truck(); Более того, вы абсолютно спокойно можете написать такое выражение

C#
1
2
3
4
5
6
7
8
9
using System;
 
new Neko().Nya();
Console.ReadKey();
 
class Neko
{
    public void Nya() => Console.WriteLine("Nya!");
}
Как видите, мы не запоминали объект Neko ни в какую переменную, но тем не менее он создался, под него выделилась память, и даже мы смогли вызвать метод. (На самом деле там компилятор насоздает переменные, но это не важно).

Теперь про переменные, скажем тот же Car bmw. Это исключительно ссылка на объект, указание адреса памяти, где хранится объект. Единственное ограничение которое накладывается на такую переменную -- объект должен либо быть Car, либо унаследован от него. (ну либо null, тогда мы никуда не указываем).


Такая аналогия. Берем 10 пронумерованых коробок, которые будут выполнять роль ОЗУ. Сам в каждую коробку по кошке. Кошка -- объект. Он создан, находится в коробке и может мяукнуть. Теперь берем карточку и пишем на ней момер коробки, и скажем просто "коробка 1. кличка Соня". Это базовый класс. Теперь берем ещё одну карточку, и пишем на ней "коробка 1. кличка Соня. Кошка, 2 года, рыжая." Это класс наследник.

Теперь заходит ветеренар, берет миску и первую карточку. Он видит что там написано только кличка и где найти кошку, но понять какой можно насыпать корм -- нельзя. Теперь он берет вторую карточку, и видит что это 2 летняя зараза, а значит её можно насыпать обычного корма. Но если нам нужнопросто подозвать кошку по кличке, нам подходят обе карточки.
1
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 378
03.07.2023, 13:03  [ТС]
Спасибо всем. Я имею введу...


Car bmw = new Truck(); - в этом случае мы можем использовать поля и методы классов Car, Truck
Truck bmw = new Truck(); - в этом случае мы можем использовать поля и методы класса только Truck
Car bmw = new Car(); - а в этом тогда случае что получаем? можем использовать поля и методы только класса Car?

Правильно? Или я что то путаю.

Просто Truck bmw = new Truck(); наследует у Car - в итоге и поля и методы можно использовать
а тут
Car bmw = new Truck(); путаница...


Может есть у кого-нибудь ссылка, что бы объяснили мне непонимающему, зачем писать Car bmw = new Truck(); если можно всегда писать Truck() bmw = new Truck(); или Car bmw = new Сar();
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,553
03.07.2023, 13:26
Цитата Сообщение от Мистер Джек Посмотреть сообщение
Car bmw = new Truck(); - в этом случае мы можем использовать поля и методы классов Car, Truck
Нет, для этого объекта можно вызывать только методы Car, так как декларируемый тип - Car, хотя фактический тип - Truck.
Цитата Сообщение от Мистер Джек Посмотреть сообщение
зачем писать Car bmw = new Truck()
Конкретно в такой строке смысла большого нет. Это лишь пример того, что ссылка на объект класса Car может совершенно легально указывать на объект класса Truck, так как Truck - это всё тот же Car, только с какими-то переопределёнными методами или свойствами. Смысл же появляется, когда такие объекты используются в коде с вызовом виртуальных функций. В нём мы можем использовать ссылку на объект родительского класса, хотя на самом деле эта ссылка будет указывать на объект дочернего класса и вызывать методы дочернего класса.
1
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
03.07.2023, 15:46
https://ru.wikipedia.org/wiki/... нформатика)
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
03.07.2023, 18:46
Цитата Сообщение от Мистер Джек Посмотреть сообщение
зачем писать Car bmw = new Truck(); если можно всегда писать Truck() bmw = new Truck(); или Car bmw = new Сar();
Затем, что не всегда можно написать Truck() bmw = new Truck(); или Car bmw = new Сar();
В данном примере — для демонстрации работы полиморфизма.
В реальной ситуации конкретный тип присваиваемого значения может быть либо неизвестен:
C#
1
Car transport = GetTransport(cargo); // Возвращает тип Car, но значение по факту может ссылаться на любой дочерний класс: Truck, Bike, Sedan и пр., в зависимости от логики метода
Либо быть выбран динамически:
C#
1
2
3
4
5
6
7
8
9
10
Car transport; // На данный момент неизвестно что понадобится
 
if (cargo.Weight < 15 * kg)
   transport = new Bike();
else if (cargo.Weight < 100 * kg)
  transport = new Sedan();
else
  transport = new Truck();
 
transport.Load(cargo); // Метод Load определен в базовом Car, потому тут без разницы какой это именно вид транспорта.
3
Эксперт .NET
 Аватар для Wolfdp
3782 / 1756 / 371
Регистрация: 15.06.2012
Сообщений: 6,517
Записей в блоге: 3
03.07.2023, 19:50
Цитата Сообщение от kolorotur Посмотреть сообщение
В данном примере — для демонстрации работы полиморфизма.
+1. Более того, существование var тонко намекает, что гораздо чаще мы тупо используем как есть, а не явно понижаем до наследника. Но учебные материалы накладывают свои правила написания кода.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2023, 19:50
Помогаю со студенческими работами здесь

Как в IntelliJ IDEA посмотреть методы которые могут быть перегружены из супер класса в класс наследник
public class CloseAction extends WindowAdapter { } Как мне посмотреть какие есть методы у WindowAdapter и перегрузить их в свой...

Что не так с компилятором или почему программа рушится просто так?
Не обращайте внимание на г*внокод, в котором смешаны и Си и Си ++, здесь это не играет никакой роли. Вопрос в том, почему на онлайн...

Програма почему-то выдает x=7. Почему так не знаю но должно выдать 216
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int d = 5; int b = -4; int k = -3; ...

Скажите почему например флешка на 4 ГБ а на ней ёмкость всего 3.73 ГБ почему это так?
Скажите почему например флешка на 4 ГБ а на ней ёмкость всего 3.73 ГБ почему это так? Почему не сделают ровно 4 ГБ ну или приближённо к...

Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много?
Почему при создании игры Lode Runner потребовалось 19 000 текстур? почему так много? ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru