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

Создание объектов дочерних классов

01.10.2010, 01:05. Просмотров 7740. Ответов 15
Метки нет (Все метки)


Допустим у меня есть класс Parent. И есть дочерние классы ChildA, ChildB, ChildC. Есть функция в которой в зависимости от того какой параметр я туда подам создается объект одного из дочерних классов и потом этот объект возвращается. Какого именно класса объект заранее неизвестно - только на этапе выполнения. Как сделать без всяких ифов и свитчей, чтобы генерился определенный дочерний объект и потом возвращался из функции? Какой дополнительный параметр передавать в функцию для этого? Думал через generics замутить, но что-то так и не вышло.

P.S. Я являюсь только клиентом этих дочерних и родительских классов. Править реализацию и интерфейсы не могу.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.10.2010, 01:05
Ответы с готовыми решениями:

Универсальный конструктор для дочерних классов
Есть родительский класс, имеющий два поля и конструктор, принимающий две переменных, которые, в...

Ошибка в наследовании: как вызвать функции дочерних классов
Всем привет. Есть такой учебный код: abstract class A { int a1; virtual void Print(); } class...

Создание дочерних узлов в treeList из Dictionary
Здравствуйте. Есть словарь подразделений Dictionary<string, RootObject1> array1 = new...

List для объектов двух классов
Есть родительский класс Cars и унаследованный PriceCars. Есть класс, в котором создаётся коллекция...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
15
Padawan
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,842
01.10.2010, 01:14 2
Создай перегруженную версию фукнции создания дочерних классов.
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
01.10.2010, 01:23 3
Цитата Сообщение от SunProphit Посмотреть сообщение
Есть функция
Цитата Сообщение от SunProphit Посмотреть сообщение
Как сделать
Так есть функция или ты только собираешься её написать?
0
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 5
02.10.2010, 02:40  [ТС] 4
Хм функция есть, но задачу по созданию дочерних объектов она не выполняет. На данный момент она создает только родительский объект.

Создай перегруженную версию фукнции создания дочерних классов.
В смысле? Для каждого дочернего класса перегрузить функцию? А если у меня дочерних классов 15? Или у меня появляется 16-ый? Не хотелось бы на каждый новый объект перегружать функцию.
Как генерировать динамически объект на основании информации о его классе(будь то строка "ChildA", или сам экземпляр класса). И затем хотелось бы использовать этот объект в качестве экземпляра именно того класса что я указал при создании(все той же строкой или еще каким-либо образом).

Добавлено через 45 секунд
То есть это невозможно сделать?
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
02.10.2010, 02:49 5
Цитата Сообщение от SunProphit Посмотреть сообщение
будь то строка "ChildA"
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
using System;
 
namespace App
{
    class Parent { }
    class ChildA : Parent { }
    class ChildB : Parent { }
 
    class Program
    {
        static Parent CreateClassByName(string name)
        {
            Type t = Type.GetType("App." + name);
            if (!t.IsSubclassOf(typeof(Parent))) return null;
            return (Parent) Activator.CreateInstance(t);
        }
 
        static void Main()
        {
            Parent first = CreateClassByName("ChildA");
            Parent second = CreateClassByName("ChildB");
 
            // ...
        }
    }
}
0
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 5
04.10.2010, 01:04  [ТС] 6
Но в итоге я получаю объект Parent. А надо определенный Child. Допустим чтобы потом добавить его generic коллекцию. Допустим List.
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
04.10.2010, 01:05 7
Цитата Сообщение от SunProphit Посмотреть сообщение
Но в итоге я получаю объект Parent. А надо определенный Child. Допустим чтобы потом добавить его generic коллекцию. Допустим List.
Поржал, спасибо. А коллекция каких объектов будет? Почему не объектов класса Parent?
0
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 5
04.10.2010, 09:18  [ТС] 8
Коллекция будет не одна: столько сколько классов чилдов столько и коллекций для них.
Цитата Сообщение от NightmareZ Посмотреть сообщение
Почему не объектов класса Parent?
Потому что есть только коллекции чилдов. Добавлять можно только в них.
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
04.10.2010, 10:10 9
Цитата Сообщение от SunProphit Посмотреть сообщение
Коллекция будет не одна: столько сколько классов чилдов столько и коллекций для них.

Потому что есть только коллекции чилдов. Добавлять можно только в них.
Ты заставляешь меня плакать

А на основании каких данных решается, в какую коллекцию помещать очередного чилда? И как это происходит?

C#
1
2
3
4
5
6
7
8
9
10
switch (className)
{
  case "ChildA":
    collectionA.Add( /* ... */ );
    break;
 
  case "ChildB":
    collectionB.Add( /* ... */ );
    break;
}
Так что-ли?
0
962 / 765 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
04.10.2010, 11:04 10
C#
1
2
3
switch (className)
{
  case "ChildA":
это чистейший бред, указывать явно имена классов...
0
1483 / 631 / 62
Регистрация: 31.03.2009
Сообщений: 2,035
04.10.2010, 11:38 11
Цитата Сообщение от Konctantin Посмотреть сообщение
C#
1
2
3
switch (className)
{
  case "ChildA":
это чистейший бред, указывать явно имена классов...
Дык вот же... а ТС просит.
0
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 5
06.10.2010, 01:19  [ТС] 12
Думал что можно как-то по красивому решить данную задачу. Но указывать коллекции вроде как все равно придется явно. Поэтому вопрос отпадает.
0
51 / 44 / 4
Регистрация: 07.10.2010
Сообщений: 95
07.10.2010, 09:05 13
interface IPArent;
class Parent : IPArent {}
class A : Parent , IPArent{}
class B : Parent , IPArent{}
static class ParentCollection
{

}
0
52 / 52 / 10
Регистрация: 25.05.2010
Сообщений: 182
07.10.2010, 09:57 14
это стандартный пример на паттерн фабрики, почитайте доки, всё уже придаманно
0
51 / 44 / 4
Регистрация: 07.10.2010
Сообщений: 95
07.10.2010, 10:46 15
Блин, и куда делось исправление


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface IPArent
{void add();}
class Parent : IPArent 
{
public void add(){...........}
}
class A : Parent , IPArent
{
public void add(){...........}
}
class B : Parent , IPArent
{
public void add(){...........}
}
//Фабрика
static class ParentCollection
{
public static IPArent A
{get {return new A();}}
public static IPArent A
{get {return new A();}}
}
В коде что то типа
C#
1
2
3
4
5
IPArent  myParent;
if(что то) myParent = ParentCollection.A();
else myParent = ParentCollection.B();
 
myParent.add();
Угу. Типичная фабрика, задача прамо таки вопрос - "О каком GoF патерне идет речь?"
0
Мохаммед Али
131 / 69 / 5
Регистрация: 14.08.2009
Сообщений: 916
07.10.2010, 11:26 16
как я понял здесь нужно заюзать индекацию) чтобы при генерации обьектов получилось что то ттипа
КлассРодитель РО=нью КлассРодитель();
РО[подкласс].обьект ... юзаем, но здесь обьекты должны быть созданы уже в самой структуре класса.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2010, 11:26

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

DataContract для дочерних классов
Есть два класса. При выполнении программы пишется: не удалось сюрелиозавать класс ChtaUser. Я так...

Foreach дочерних объектов Canvas из UserControl
Всем привет =)) Помогите пожалуйста в сложной ситуации. У меня есть MainWindow(ну это как обычно),...

Сравнение разных типов дочерних классов IComparable CompareTo
Доброго времени суток! Возникла задача сортировать список List<T>. В принципе ничего сложного нет,...

Создание ленты вкладок дочерних форм
Доброго всем времени суток. У меня появилась такая проблемка... создаю родительскую и несколько...

созданием объектов, классов и механизмом наследования c#
в С# Построить иерархию классов в соответствии с вариантом задания: -Журнал, книга, печатное...

Сериализация объектов классов Pen и Brush
При попытке использовать бинарный сериализатор для полей класса с типами данных Pen или SolidBrush...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.