Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153

Upcast и downcast

17.06.2018, 13:12. Показов 3497. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. помогите с решением задачи. задача по сортировке массива методом пузырька. массив числе передаю методу сортировщику, но он принимает массив обьектов. и вот тут загвоздка, как сравнить обьекты. вот не могу додуматься.
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
{class Program {
        static void Main(string[] args) {
            
            int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 };
            MyTools.Sort(arr);//вот как тут массив передать.надо сделать апкаст, но как?
           for (int i = 0; i < arr.Length; i++) {
                Console.Write(arr[i] + " ");
            }
 
            Console.ReadKey();
        }
    }
 
 
class MyTools {
        public static void Sort(object[] array) {
            object temp;
            for (int i = 0; i < array.Length; i++) {
                for (int j = 0; j < array.Length - 1; j++) {
                    if (array[j] > array[j + 1]) // вот эту строку как исправить?
{
                        temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }
        }
    }
 
}
заранее благодарен
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2018, 13:12
Ответы с готовыми решениями:

Upcast и Downcast
Код: namespace ConsoleApplication34 { class Employee { public int GetYearsEmployed() { ...

Методы с UpCast и DownCast
Почему экземпляру inst3, нельзя получить к полю fieldDerived, но при этом срабатывает Method() из класса Derived? Почему различаются...

Приведение типов. UpCast & DownCast
Объяснить пожалуйста как работать с таким понятием как приведение типов (наследование, приведение к базовому типу)? В чем заключается суть?...

20
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
17.06.2018, 13:19
Экземпляры класса object — никак. Объекты сравнения должны реализовывать интерфейс IComparable
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.06.2018, 13:24
Цитата Сообщение от Гиоргий Посмотреть сообщение
как сравнить обьекты
можно передавать отдельно компаратор
можно еще так например
C#
1
2
3
4
5
6
public static void Sort<T>(T[] array) where T : IComparable
    .
    .
    if (array[j].CompareTo(array[j + 1]) > 0)
    .
    .
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 13:28  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Экземпляры класса object — никак. Объекты сравнения должны реализовывать интерфейс IComparable
интерфейс еще не продоходили. как я понял я должен массив чисел апнуть до обьекта, а потом при сравнении сделать даункаст массива обьектов до чисел. но как реализовать?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
17.06.2018, 13:31
Цитата Сообщение от Гиоргий Посмотреть сообщение
а потом при сравнении сделать даункаст массива обьектов до чисел
Зачем вообще в метод передавать объекты? Почему не объявить сразу нужный тип:
C#
1
public static void Sort(int[] array)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.06.2018, 13:32
Цитата Сообщение от Гиоргий Посмотреть сообщение
как я понял
а как написано в задании?
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 13:39  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Зачем вообще в метод передавать объекты? Почему не объявить сразу нужный тип:
C#
1
public static void Sort(int[] array)
мы сейчас проходим апкаст и даункаст. в методе Sort мы передали вначале массив чисел, как вы сейчас показали. но для понимания вот этих кастов лектор заменил на обьекты. и вот появляется ошибка и надо ее исправить

Добавлено через 2 минуты
Цитата Сообщение от КОП Посмотреть сообщение
а как написано в задании?
задание-- написать метод который примет массив обьектов и разложит их по возрастанию.но проблема в том что мы не можем сравнить на больше меньше два неизвестных типа обьектов
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
17.06.2018, 13:39
Попробуй так:
C#
1
if ((int)array[j] > (int)array[j + 1])
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 13:45  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
C#
1
if ((int)array[j] > (int)array[j + 1])
это приведение да? может считатться как даункаст?

Добавлено через 2 минуты
Цитата Сообщение от ViterAlex Посмотреть сообщение
C#
1
if ((int)array[j] > (int)array[j + 1])
но в 6 строке все равно выдает ошибку. я ведь передаю агрументом числа, а принимает обьекты. я должен передать обьекты наверно
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.06.2018, 13:50
Цитата Сообщение от Гиоргий Посмотреть сообщение
.но проблема в том что мы не можем сравнить на больше меньше два неизвестных типа обьектов
именно поэтому это задание неосуществимо. Можно конечно скастить к (int), но как только я передам double все полетит, а потом я передам мной только что придуманный класс, что тогда делать?

Поэтому надо либо упростить формулировку, что передается массив конкретно int, либо надо передавать компаратор явно (или comparable класс)
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
17.06.2018, 13:56
Цитата Сообщение от Гиоргий Посмотреть сообщение
может считатться как даункаст?
может. Приведение к менее общему типу.
Цитата Сообщение от Гиоргий Посмотреть сообщение
в 6 строке все равно выдает ошибку. я ведь передаю агрументом числа, а принимает обьекты
Так и массив объяви как object, но наполни числами:
C#
1
var ar = new object[] { 800, 11, 50, 771, 649, 770, 240, 9 };
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 15:41  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
Так и массив объяви как object, но наполни числами:
C#
1
var ar = new object[] { 800, 11, 50, 771, 649, 770, 240, 9 };
я уже надоел наверно. Извинияюсь конечно, но если у меня дан массив int как в данном случае, как я могу его передать в массив обьектом?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.06.2018, 15:51
Гиоргий,
C#
1
MyTools.Sort(arr.Cast<object>().ToArray());
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 15:54  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
C#
1
MyTools.Sort(arr.Cast<object>().ToArray());
а нельзя ли это немного легче написать. так как такое еще не проходили .Cast и ToArray
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.06.2018, 16:04
Гиоргий, можно, однако тогда это руками просто проходить по массиву интов и создавать новый массив объектов. Есть ещё встроенный метод у Array:
C#
1
object[] arrObj = Array.ConvertAll(arr, o => (object) o);
всё Вы никогда не пройдёте, Вам будут давать только основы, а дальше уже зависит от задания как нужно делать. Ну и от преподавателя, что он хочет от Вас получить именно.

Добавлено через 6 минут
есть ещё вот такая форма записи метода ConvertAll:

C#
1
2
3
4
5
6
object[] arrObj = Array.ConvertAll(arr, Converter);
/******************/
private static object Converter(int input)
        {
            return (object) input;
        }
думаю Вам она должна подойти.
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 16:13  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
думаю Вам она должна подойти.
Я вообще запутался, не пойму уже ничего. спасибо за помощь!!!
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.06.2018, 16:28
Гиоргий, вот Вам полный код:

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
class Program
    {
        static string result = string.Empty;
        static void Main(string[] args)
        {
            int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 };
            MyTools.Sort(Array.ConvertAll(arr, Converter));//вызываем функцию конвертации из int[] в object[]
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
 
            Console.ReadKey();
        }
 
        private static object Converter(int input)
        {
            return (object) input; // кастим в object
        }
    }
 
    class MyTools
    {
        public static void Sort(object[] array)
        {
            object temp;
            for (int i = 0; i < array.Length; i++)
            {
                for (int j = 0; j < array.Length - 1; j++)
                {
                    if ((int)array[j] > (int)array[j + 1]) // кастим назад в Int
                    {
                        temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }
        }
    }
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 16:37  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
//вызываем функцию конвертации из int[] в object[]
а вот нельзя вместо функции, переменной ссылке на массив обьектов передать ссылку на массив чисел, и потом уже в Sort передать эту ссылку?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
17.06.2018, 17:04
Гиоргий, если я правильно понял о чём вы, то нет
0
50 / 4 / 0
Регистрация: 21.02.2018
Сообщений: 153
17.06.2018, 17:56  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
если я правильно понял о чём вы, то нет
вот примерно такое : int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 };. Object[] obj = arr?

Добавлено через 40 минут
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
Гиоргий, вот Вам полный код:
но сейчас другая проблема. в Main методе где нужно выводить на экран массив выводится массив первоначальный, а не сортированный. не получил он по ссылке сотрировку из класс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2018, 17:56
Помогаю со студенческими работами здесь

Спецификация generic upcast/downcast в generic типах
Почему только интерфейсы и делегаты в C# поддерживают технику ковариантности и контрвариантности в Generic типах?

Downcast
Всегда думал что в переменной дочернего класса может сохранить объект родительского класса(через кастинг), но возникает вопрос. почему...

Generic Типы и двойной UpCast
всем привет, имеется следующий пример: public abstract class Shape { } public class Circle : Shape { } public interface...

Для чего используют UPcast?
как правильно использовать upcast ? вот мой вариант это что то подобное к юсб порту (в моем случае юсб это интерфейс) а классы это...

Наследование и upcast параметров метода
class A { public virtual void M(int a) { Console.WriteLine(&quot;A.M(int a)&quot;); } } ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru