Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
-1 / 0 / 0
Регистрация: 09.08.2015
Сообщений: 13

Возврат объекта определенного класса в методе через условие

01.03.2019, 09:44. Показов 6989. Ответов 8

Студворк — интернет-сервис помощи студентам
День добрый, дорогие форумчане!

Сразу хочу извиниться, если тема есть и не нашел ее. Просто ломаю голову третий день, а внятного ответа (решения) найти не могу... Голова уже "UUUUzzzz z z ...."

Собственно требование следующее:
Имеется три класса, назовем их условно Class1(), Class2(), Class3() все они наследуются от базового класса Base()
C#
1
2
3
4
class Base(){
   public int Age {get;set;}
   public string Name{get;set}
}
Далее идет некий метод, где пользователю требуется выбрать определенный класс, и исходя из его выбора, нужно создать объект того класса который он выбрал. Например так:
C#
1
2
3
4
5
6
 public void Method()
{
   Console.WriteLine("1 класс - цифра 1 \n 2 класс - цифра 2 \n и т.д.");
   if(переменная == 1)
       Class1 cl1 = new Class1();
}
И после выбранного класса, требуется передать этот объект выбранного класса другому методу :
C#
1
2
3
4
5
6
WriteXmlFile()
{
  //И сделать так, что бы в этом методе значения передаваемого объекта можно было переназначать
  "тот самый объект".Name = "Artem";
  "тот самый объект".Age = 23;
}

Заранее спасибо за любую помощь. т.к. много чего еще не понимаю, не судите строго
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2019, 09:44
Ответы с готовыми решениями:

Создание объекта класса в методе этого же класса
собственно вопрос. можно ли создавать объект класса в методе того же класса? насколько это правильно и как это можно сделать (если это...

Присвоение переменным определённого значения в методе класса
Написать программу через метод класса.Даны две переменные целого типа: A и B. Если их значения не равны, то присвоить каждой переменной...

Возврат объекта класса из функции
Имеется следующий код: #include "stdafx.h" #include <iostream> using namespace std; /*Задача: Определить класс список...

8
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.03.2019, 12:05
Цитата Сообщение от Nikolaikolya Посмотреть сообщение
И после выбранного класса, требуется передать этот объект выбранного класса другому методу
C#
1
2
3
4
5
6
void WriteXmlFile(Base obj)
{
  //И сделать так, что бы в этом методе значения передаваемого объекта можно было переназначать
  obj.Name = "Artem";
  obj.Age = 23;
}
0
-1 / 0 / 0
Регистрация: 09.08.2015
Сообщений: 13
01.03.2019, 12:16  [ТС]
Тогда какому классу из трех именно классу будет присвоено значение?

Добавлено через 4 минуты
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
2
3
4
5
6
void WriteXmlFile(Base obj)
{
  //И сделать так, что бы в этом методе значения передаваемого объекта можно было переназначать
  obj.Name = "Artem";
  obj.Age = 23;
}
В том то вся и беда, что нужно присвоить данные определенному классу.
сделать то можно и без этой выборки, но тогда текст метода будет уж очень большой и повторятся для каждого класса отдельно.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.03.2019, 12:21
Цитата Сообщение от Nikolaikolya Посмотреть сообщение
Тогда какому классу из трех именно классу будет присвоено значение?
Тому объекту, который вы передадите в метод WriteXmlFile.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
 
namespace ConsoleApplication240
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = CreateObject();
            ChangeObjectProperties(obj);
 
            Console.WriteLine("Name: " + obj.Name);
            Console.WriteLine("Age: " + obj.Age);
            Console.ReadKey();
        }
 
        static Base CreateObject()
        {
            Console.Write("Enter class type 1, 2 or 3: ");
            
            while(true)
            switch (Console.ReadLine())
            {
                case "1": return new Class1();
                case "2": return new Class2();
                case "3": return new Class3();
            }
        }
 
        static void ChangeObjectProperties(Base obj)
        {
            obj.Name = "Artem";
            obj.Age = 23;
        }
    }
 
    class Base
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
 
    class Class1 : Base
    {
    }
 
    class Class2 : Base
    {
    }
 
    class Class3 : Base
    {
    }
}
Цитата Сообщение от Nikolaikolya Посмотреть сообщение
В том то вся и беда, что нужно присвоить данные определенному классу.
сделать то можно и без этой выборки, но тогда текст метода будет уж очень большой и повторятся для каждого класса отдельно.
Классу вообще ничего присвоить нельзя. Класс - это участок программного кода. Присвоить можно объекту.
Опишите подробно задачу.
0
-1 / 0 / 0
Регистрация: 09.08.2015
Сообщений: 13
01.03.2019, 12:43  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
2
3
4
5
6
void WriteXmlFile(Base obj)
{
  //И сделать так, что бы в этом методе значения передаваемого объекта можно было переназначать
  obj.Name = "Artem";
  obj.Age = 23;
}
В общем были попытки сделать в Base классе через virtual метод, который возвращал новую ссылку на объект из класса-наследника, так же была попытка сделать через массив элементов Base[] base = {new class1 .... и т.д} но все равно возвращается ссылка, а не сам объект!

Добавлено через 7 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
Тому объекту, который вы передадите в метод WriteXmlFile.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
 
namespace ConsoleApplication240
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = CreateObject();
            ChangeObjectProperties(obj);
 
            Console.WriteLine("Name: " + obj.Name);
            Console.WriteLine("Age: " + obj.Age);
            Console.ReadKey();
        }
 
        static Base CreateObject()
        {
            Console.Write("Enter class type 1, 2 or 3: ");
            
            while(true)
            switch (Console.ReadLine())
            {
                case "1": return new Class1();
                case "2": return new Class2();
                case "3": return new Class3();
            }
        }
 
        static void ChangeObjectProperties(Base obj)
        {
            obj.Name = "Artem";
            obj.Age = 23;
        }
    }
 
    class Base
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }
 
    class Class1 : Base
    {
    }
 
    class Class2 : Base
    {
    }
 
    class Class3 : Base
    {
    }
}

Классу вообще ничего присвоить нельзя. Класс - это участок программного кода. Присвоить можно объекту.
Опишите подробно задачу.
Это и так понятно. но если создать к примеру некий метод в Class1 то через obj.Method он недоступен. Может я что то не понимаю, и плохо объяснил в начале...

Добавлено через 8 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
Классу вообще ничего присвоить нельзя. Класс - это участок программного кода. Присвоить можно объекту.
Опишите подробно задачу.
Да мне зачем что то классу присваивать, мне нужно получить всего лишь объект класса.

Это и так понятно. но если создать к примеру некий метод в Class1 то через obj.Method он недоступен. Может я что то не понимаю, и плохо объяснил в начале... Именно нужно что бы возвращался объект класса, а не ссылка! Что бы в дальнейшим с ним можно было работать в коде.

Примерно так:
C#
1
2
3
4
5
6
static void WorkClass(Object obj)
        {
            //И вот здесь в этом методе вместо obj подставить объект того класса, которого мы вызываем!
            new Class1().Method(); //вместо new Class1() подставить тот obj который передали.
            
        }
0
13 / 8 / 5
Регистрация: 27.02.2019
Сообщений: 25
02.03.2019, 03:14
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public enum EFoo
        {
            foo1,
            foo2,
            foo3
 
        }
        public class FooFactory
        {
            public static IFoo GetFoo(EFoo efoo)
            {
                switch(efoo)
                {
                    case EFoo.foo1:
                        return new Foo1();
                    case EFoo.foo2:
                        return new Foo2();
                    case EFoo.foo3:
                        return new Foo3();
                    default:
                        throw new NotImplementedException();
                }
            }
        }
        public interface IFoo
        {
            void MyCoolMethod();
        }
        public class Foo1:IFoo
        {
            public void MyCoolMethod()
            {
                Console.WriteLine("Foo1");
            }
        }
        public class Foo2 : IFoo
        {
            public void MyCoolMethod()
            {
                Console.WriteLine("Foo2");
            }
        }
        public class Foo3 : IFoo
        {
            public void MyCoolMethod()
            {
                Console.WriteLine("Foo3");
            }
        }
        static void Main()
        {
            var someFoo = FooFactory.GetFoo(EFoo.foo3);
            someFoo.MyCoolMethod();
            Console.ReadKey();
        }
0
-1 / 0 / 0
Регистрация: 09.08.2015
Сообщений: 13
02.03.2019, 07:49  [ТС]
Цитата Сообщение от Vanek239 Посмотреть сообщение
ublic enum EFoo
* * * * {
* * * * * * foo1,
* * * * * * foo2,
* * * * * * foo3
}
* * * * public class FooFactory
* * * * {
* * * * * * public static IFoo GetFoo(EFoo efoo)
* * * * * * {
* * * * * * * * switch(efoo)
* * * * * * * * {
* * * * * * * * * * case EFoo.foo1:
* * * * * * * * * * * * return new Foo1();
* * * * * * * * * * case EFoo.foo2:
* * * * * * * * * * * * return new Foo2();
* * * * * * * * * * case EFoo.foo3:
* * * * * * * * * * * * return new Foo3();
* * * * * * * * * * default:
* * * * * * * * * * * * throw new NotImplementedException();
* * * * * * * * }
* * * * * * }
* * * * }
* * * * public interface IFoo
* * * * {
* * * * * * void MyCoolMethod();
* * * * }
* * * * public class Foo1:IFoo
* * * * {
* * * * * * public void MyCoolMethod()
* * * * * * {
* * * * * * * * Console.WriteLine("Foo1");
* * * * * * }
* * * * }
* * * * public class Foo2 : IFoo
* * * * {
* * * * * * public void MyCoolMethod()
* * * * * * {
* * * * * * * * Console.WriteLine("Foo2");
* * * * * * }
* * * * }
* * * * public class Foo3 : IFoo
* * * * {
* * * * * * public void MyCoolMethod()
* * * * * * {
* * * * * * * * Console.WriteLine("Foo3");
* * * * * * }
* * * * }
* * * * static void Main()
* * * * {
* * * * * * var someFoo = FooFactory.GetFoo(EFoo.foo3);
* * * * * * someFoo.MyCoolMethod();
* * * * * * Console.ReadKey();
* * * * }

День добрый. Наконец то адекватный и надеюсь компетентный человек пришел Это клевое решение с вызовом методов через Интерфейс, ведь я уже писал выше, что пытался сделать тоже самое через абстрактный класс (Предок), по сути тоже самое. Проблема так же и заключается я не могу использовать код для постановки и обращения к полям.

Надеюсь сейчас все объяснить. Может все таки я делаю через одно место

И так, есть обычный класс Fighters, где записаны поля и виртуальный метод. Вот он:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Fighter
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public int ID { get; set; }
        public int Stamina { get; set; }
        public int Strenght { get; set; }
        public int Agility { get; set; }
        public int Intelect { get; set; }
 
        public virtual void Opisanie() { }
        
    }
После идет наследование 3х классов Mage() Warrior() Rogue() (Разных видов бойцов). И у каждого бойца в конструкторе инициализируются поля определенному значению.

Далее, имеется метод, который при создании определенного бойца записывает в файл поля того, кого создали. Сейчас это выглядит так -
C#
1
2
3
4
5
6
7
8
9
10
public void ReadDate(string s)
{
                Mage mage = new Mage();
                xDoc.Root.Add(new XElement("Person", new XAttribute("id", mage.CreateID()), new XAttribute("type", mage.Type),
                    new XElement("name", mage.Name),
                    new XElement("agility", mage.Agility),
                    new XElement("intelect", mage.Intelect),
                    new XElement("stamina", mage.Stamina)));
                xDoc.Save(path);
}
И в этом моменте появляется проблема, т.к. такой код приходится писать для каждого класса... Вот и задумался над тем, что бы создать метод, который принимал определенного бойца и записывал данный в файл без повторения кода.

Если делать как вчера человек предложит, то тогда необходимо самом задавать параметры, а они уже заданны в конструкторе класса.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
02.03.2019, 12:48
Nikolaikolya, Для просмотра свойств и полей существует рефлексия. с ее помощью можно получить все поля и свойства типа с их именами и атрибутами. Далее методом перебора свойств можно получить значение каждого свойства, либо установить это значение. А если речь идет о сохранение или считывании из файла xml то там еще проще. есть уже готовые классы xml сериализации которые могут превратить объект в xml а xml в объект.

Опишите более подробно что вы хотите.
0
-1 / 0 / 0
Регистрация: 09.08.2015
Сообщений: 13
02.03.2019, 13:55  [ТС]
Цитата Сообщение от Andreyip Посмотреть сообщение
Nikolaikolya, Для просмотра свойств и полей существует рефлексия. с ее помощью можно получить все поля и свойства типа с их именами и атрибутами. Далее методом перебора свойств можно получить значение каждого свойства, либо установить это значение. А если речь идет о сохранение или считывании из файла xml то там еще проще. есть уже готовые классы xml сериализации которые могут превратить объект в xml а xml в объект.
Опишите более подробно что вы хотите.
Всем спасибо большое!

В общем сделал так: Создал метод, который принимает в качестве параметра Класс-Предок, где и будет происходить все самое интересное (Запись данных по выбранному классу через проверку).

Т.е. при выборе персонажа, создаются три объекта классов которые хотим передать в тот самый метод. После вызывается метод, который и записывает данные.

В общем вот сам метод

C#
1
2
3
4
5
6
7
8
9
10
11
static void PrintMethod(Base bas)
        {
 
            string path = @"a.xml";
            XDocument xDoc = XDocument.Load(path);
 
            xDoc.Root.Add(new XElement("Person", new XAttribute("id", bas.ID), new XAttribute("type", bas.Age),
                    new XElement("name", bas.Name)));
            xDoc.Save(path);
 
        }
А вот после идет как раз создание объектов класса.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            Class2 cl2 = new Class2();
            Class1 cl1 = new Class1();
            Class3 cl3 = new Class3();
 
            while (true)
            {
                Console.Write("Chislo");
                string s = Console.ReadLine();
                if (s == "1")
                    PrintMethod(cl1);
                else if (s == "2")
                    PrintMethod(cl2);
                else if (s == "3")
                    PrintMethod(cl3);
            }
В общем как то так. Если есть у кого предложения по "улучшению" или критика, всегда буду рад

Писал в начале, объяснять не мое в общем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2019, 13:55
Помогаю со студенческими работами здесь

Виртуальная функция и возврат объекта класса
Доброго времени суток! Столкнулся с проблемой. Есть переопределенный оператор умножения в родительском классе. virtual CComplex...

Можно ли получить текущий класс объекта в статическом методе родительского класса?
Здравствуйте, можно ли получить текущий класс объекта в статическом методе родительского класса?

Можно ли реализовать в классе обращение к свойству по индексу и возврат объекта класса?
Всем привет! Возможно зря замахнулся на такую реализацию, но всё же: Допустим, есть класс Student У этого класса есть...

Как получить адрес определенного объекта класса?
Пользуюсь RAD Studio XE2. Задача определить адрес объекта (в данном случае int) VisibleColCount в классе TValueListEditor. Казалось бы...

Как реализовать вывод свойств каждого объекта определённого класса WMI?
Как реализовать вывод сведений значений свойства каждого объекта определнного класса WMI $OSwmi = ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru