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

Конфликт одноименных полей классов из разных Namespace

08.11.2012, 12:14. Показов 6151. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть задача следующего плана,
Хотелось бы в ПО иметь несколько однотипных
классов
Namespace1
Namespace2
Namespace3
Каждый в будущем хотело бы скомпилировать
отдельной динамической библиотекой. Но пока это не суть...

В namespace есть свои структуры, конструкторы, массивы,
но они имеют одинаковые имена и вызовы, что мне позволяет компилировать
ПО с любым namespace, только меняя её в директивах.
Теперь я хочу получить возможность переключаться между ними динамически.
Когда я подключаю все Namespace я получаю ошибку рода...:
Ошибка 6 "cStatus" - неоднозначная ссылка между "Class1.cStatus" и "Class2.cStatus"

Как мне написать это всё правильно?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2012, 12:14
Ответы с готовыми решениями:

Использование одинаковых классов разных namespace
Есть проект (NameSpace Work1), к которому подключена библиотека Dll (создана на основе программы с NameSpace Work2). В проекте и в...

Массив разных классов. Как добратся до всех полей этих классов?
Все классы имеют общего предка. Экземпляры этих классов запихнуты в один массив нужно както добраться до полей и методов которые...

Связывание значений полей и свойств объектов разных классов
Здравствуйте. Нужен совет. Имеется переменная типа SolidColorBrush. Есть объект другого класса, и я хочу связать соответствующее его...

26
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
08.11.2012, 12:23
вместо имени класса которое дублируется напишите полностью с namespace
т.е. вместо
C#
1
new cStatus();
пишите
C#
1
new Class1.cStatus();
если правильно понял о чем речь
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 12:26  [ТС]
Мне нужно, что бы в одном варианте

C#
1
2
3
4
 if (varA) 
  cStatus  = new Class1.cStatus();
 else 
  cStatus  = new Class2.cStatus();
Это я услоно написал, но смысл в этом...

Я не могу явно указывать, к которому namespace относится cStatus.
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
08.11.2012, 12:59
вы динамически получаете сборку с классом?
также динамически получите список классов и из нужного вам класса выковыряйте namespace

посмотрите здесь, думаю близко к вашей теме
http://stackoverflow.com/quest... n-assembly
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 14:02  [ТС]
Цитата Сообщение от Tessen Посмотреть сообщение
вы динамически получаете сборку с классом?
также динамически получите список классов и из нужного вам класса выковыряйте namespace
[/url]
не совсем динамически...или я что-то не понял...
идея в следующем:
меня есть

C#
1
2
 using Name1;
 using Name2;
в который одинаковый набор классов, в том числе и по именам.
мне нужно в зависимости от переменной varA использовать либо
один класс, либо второй
В частности в name1 класс работы с имитатором, в name2 класс работы
с живым устройством.

C#
1
2
3
4
5
   cClass  Device  = null;
 if (varA) 
     Device = Name1.cClass(); 
 else 
     Device = Name2.cClass();
но по факту такой код скомпилировать нельзя.
cClass присутствует в обоих namespace.
Предполагаю, что я не верно вообще программирую...
то есть обычно это пишут по другому. Но как?
0
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
08.11.2012, 14:23
возможно неправильно советую:
вам нужна ОБЩАЯ часть реализации этих классов?
т.е. вы знаете что в этом классе есть метод DoSomething который есть во всех реализациях, называется одинаково и т.д., т.е.вот эти общие части вы хотите использовать?
создайте интерфейс содержащий нужные методы, реализуйте во всех классахusing
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
System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            I.IClass sClass = null;
            for (int i = 0; i < 10; i++)
            {
                if (i % 2 == 0)
                    sClass = new A.Class();
                else
                    sClass = new B.Class();
                sClass.DoSomething();
            }
            Console.ReadLine();
        }
    }
}
namespace I
{
    interface IClass
    {
        void DoSomething();
        string Description { get; set; }
    }
}
 
namespace A
{
    class Class:I.IClass
    {
        public string Description { get; set; }
        public void DoSomething()
        {
            Console.WriteLine("I'm class A");
        }
    }
}
namespace B
{
    class Class:I.IClass
    {
        public string Description { get; set; }
        public void DoSomething()
        {
            Console.WriteLine("I'm class B");
        }
    }
}
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.11.2012, 14:29
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
namespace ConsoleApplication49
{
    namespace NS1
    {
        public class A
        {
 
        }
    }
 
    namespace NS2
    {
        public class A
        {
 
        }
    }
 
    class Program
    {
        static void Main()
        {
            bool f = false;
            var k = f ? (dynamic) new NS1.A() : new NS2.A();
        }
    }
}
Но это не очень хороший вариант. Через интерфейсы намного продуктивнее.
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 16:16  [ТС]
Tessen, это очень красиво,
попробую как это реализуется у меня, о результатах отпишусь,
уверен возникнет вторичный вопрос по части:
как потом перейти в dll,
хотелось бы, что бы
NS1 - реализовался в отдельную ns1.dll
NS2 - реализовался в отдельную ns2.dll
что при этом делать с I...?

ps: Psilon, спасибо, но возникает проблема с объявлением "var"...
в теории у меня вопрос в этом и был...
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.11.2012, 16:20
Pyhesty, в чем проблема? var в данном случае имеет тип dynamic
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 16:36  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Pyhesty, в чем проблема? var в данном случае имеет тип dynamic
понял...
ещё раз спасибо...
0
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
08.11.2012, 16:45
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
var k = f ? (dynamic) new NS1.A() : new NS2.A();
только если Ф тру, тогда будет динамик, а иначе нс2.а.
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
dynamic k =  f ? new NS1.A() : new NS2.A();
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.11.2012, 22:17
Savvy,

Не по теме:

да, у меня компиль глючит. Я даже в MS отправил заявку. Хотя не у меня одного, что не может не радовать. Может поправят)

0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 13:51
Цитата Сообщение от Pyhesty Посмотреть сообщение
уверен возникнет вторичный вопрос по части:
как потом перейти в dll,
хотелось бы, что бы
NS1 - реализовался в отдельную ns1.dll
NS2 - реализовался в отдельную ns2.dll
что при этом делать с I...?
Интересно, автор с этим разобрался?

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

Добавлено через 15 минут
А нет, нельзя сделать интерфейс в самой проге, потому что при попытке добавить ссылку на библиотеку, если библиотека уже ссылается на прогу создаст циклическую зависимость. Видимо придётся делать третью библиотеку с интерфейсами.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
10.11.2012, 14:00
Вот держи
Есть эксешник ConsApp_PlusTwoDll (название делал, когда ещё думал, что будет 2 библиотеки). И 3 библиотеки FirstLibrary, SecondLibrary и MainLibrary
ConsApp_PlusTwoDll ссылается на все 3 библиотеки. FirstLibrary и SecondLibrary ссылаются на MainLibrary.
Вложения
Тип файла: zip ConsApp_PlusThreeDll.zip (41.4 Кб, 6 просмотров)
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
12.11.2012, 11:09  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Интересно, автор с этим разобрался?

Вариант с интерфейсом работает просто изумительно, все классы устройств
объединились под одной шапкой, но вот с dll ещё не пробовал...
казалось бы не должно быть проблем... файл интерфейса оставить в проекте и
в интерфейс подключить две наследующие его библиотеки...
но может я и не прав... не всё так просто и русло не без подводных каменей...
получитс - отпишусь
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.11.2012, 11:46
Зачем вообще по разным неймспейсам распихивать? Можно все вшить в один класс, а классы называть функциональней, а не просто одним и тем же именем) Логика вся та же, только непонятно: неужели у вас эти классы настолько перегружены, что нужно писать отдельные неймспейсы? То есть все то же самое, только вместо
C#
1
2
3
4
5
var Ic = IClass;
if (i % 2 == 0)
   Ic = new A.Class();
else
   Ic = new B.Class();
писать
C#
1
2
3
4
5
var Ic = IClass;
if (i % 2 == 0)
   Ic = new A();
else
   Ic = new B();
0
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
12.11.2012, 11:52  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Зачем вообще по разным неймспейсам распихивать? Можно все вшить в один класс
Есть софт отображающий видео изображение с разрабатываемых коллегами видео камер.
Количество видеокамер в перспективе не ограничено.
Потребителю передаётся софт с библиотекой его камеры (или тех что уже есть в наличии).
Так же будет ещё и SDK, который бует описывать работу с камерой. Хотя получается, что он будет
унивверсальный.
Сейчас разработка классов под камеры идёт параллельно. и объединяются только файлом интерфейса...

Ну вот не знаю... может быть вы и правы и не нужно городить кучу dll библиотек под каждую камеру...
а ограничиться одной, которую постоянно обновлять и дорабатывать... Но изначально идеология была
такая - для каждой камеры своя dll.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.11.2012, 11:55
Pyhesty, да пожалуйста, почему бы нет, но почему нельзя в один неймспейс закинуть?
camera1.dll
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class A
   {
      ...
   }
}
camera2.dll
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class B
   {
      ...
   }
}
Если очень надо, даже один класс можно распихнуть на какое угодно кол-во dll с помощью ключевого слова partial, а уж разные классы - сам Бог велел.
1
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
12.11.2012, 12:26  [ТС]
черт... я что-то не подумал об этом... зашоренность...
нужно попробовать...

Добавлено через 26 минут
Цитата Сообщение от Psilon Посмотреть сообщение
Pyhesty, да пожалуйста, почему бы нет, но почему нельзя в один неймспейс закинуть?
camera1.dll
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class A
   {
      ...
   }
}
camera2.dll
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class B
   {
      ...
   }
}
Если очень надо, даже один класс можно распихнуть на какое угодно кол-во dll с помощью ключевого слова partial, а уж разные классы - сам Бог велел.
Аааа....!!! Так нет же, с этого всё и начиналось (см, первый и второй посты):
если классы будут разные, то невозможно выполнить структуру:

C#
1
2
3
4
5
6
  
   ?Class cStatus;
 if (varA) 
   cStatus  = new A.cStatus();
 else 
    cStatus  = new B.cStatus();
Тк MyClass должен быть тогда некоторым динамическим классом... в противном
случае присвоение не получится.
Когда мы это обсуждали решили, что работать с интерфейом удобнее и правильнее.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.11.2012, 12:31
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   interface IClass
   {
      ...
   }
}
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class A : IClass
   {
      ...
   }
}
C#
1
2
3
4
5
6
7
Namespace MyCam
{
   class B :IClass
   {
      ...
   }
}
C#
1
2
3
4
5
IClass cStatus;
if (i % 2 == 0)
   cStatus = new A();
else
   cStatus = new B();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2012, 12:31
Помогаю со студенческими работами здесь

наследование одноимённых классов
Пример: namespace a { class A { public: A(); }; } // end of namespace a

Получение результатов выборки из одноименных полей
Так получилось, что в нескольких таблицах БД имена столбцов повторяются. Табл. Страна (id_country, runame, enname) Табл. Город...

Копирование значений однотипных одноименных полей класса
Есть класс Class Class1 { Int Var1; String Var2; } И Class Class2 { Int Var1;

Вызов одноименных функций классов наследников из родительского класса
Как вызвать функцию классов наследников из родительского класса. Нужно что бы было универсальное решение, если мы захотим создать еще...

#include <list> - конфликт using namespace std с другими инклюдами
Всем привет. Появилась надобность использовать списки, однако #include &lt;list&gt; подключается только вместе с using namespace std. Мои...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru