Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
#1

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

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

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

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

Как мне написать это всё правильно?

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2012, 12:14
Ответы с готовыми решениями:

The type or namespace name 'DirectoryServices' does not exist in the namespace 'System'
Подскажите, пожалуйста! Только начинаю на C# писать!:scratch: Вот такой вроде...

Работа с массивом из разных классов
Приветствую. Вопрос состоит в следующем, имеется Словарь, который должен быть...

Преобразоване классов из разных пространств имен
Добрый день! У меня существует два полностью одинаковых класса, но они...

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

Клиент-сервер: Оповещение о событии других классов в зависимости от значения одного из полей
Есть пустыня. В пустыне есть область, где можно добывать полезные ископаемые....

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

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

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

посмотрите здесь, думаю близко к вашей теме
http://stackoverflow.com/questions/6...of-an-assembly
0
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 14:02  [ТС] #5
Цитата Сообщение от 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
Tessen
679 / 646 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
08.11.2012, 14:23 #6
возможно неправильно советую:
вам нужна ОБЩАЯ часть реализации этих классов?
т.е. вы знаете что в этом классе есть метод 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
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
08.11.2012, 14:29 #7
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
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 16:16  [ТС] #8
Tessen, это очень красиво,
попробую как это реализуется у меня, о результатах отпишусь,
уверен возникнет вторичный вопрос по части:
как потом перейти в dll,
хотелось бы, что бы
NS1 - реализовался в отдельную ns1.dll
NS2 - реализовался в отдельную ns2.dll
что при этом делать с I...?

ps: Psilon, спасибо, но возникает проблема с объявлением "var"...
в теории у меня вопрос в этом и был...
0
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
08.11.2012, 16:20 #9
Pyhesty, в чем проблема? var в данном случае имеет тип dynamic
0
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
08.11.2012, 16:36  [ТС] #10
Цитата Сообщение от Psilon Посмотреть сообщение
Pyhesty, в чем проблема? var в данном случае имеет тип dynamic
понял...
ещё раз спасибо...
0
Savvy
119 / 117 / 6
Регистрация: 21.12.2011
Сообщений: 348
08.11.2012, 16:45 #11
Цитата Сообщение от 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
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
08.11.2012, 22:17 #12
Savvy,

Не по теме:

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

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

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

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

Вариант с интерфейсом работает просто изумительно, все классы устройств
объединились под одной шапкой, но вот с dll ещё не пробовал...
казалось бы не должно быть проблем... файл интерфейса оставить в проекте и
в интерфейс подключить две наследующие его библиотеки...
но может я и не прав... не всё так просто и русло не без подводных каменей...
получитс - отпишусь
0
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
12.11.2012, 11:46 #16
Зачем вообще по разным неймспейсам распихивать? Можно все вшить в один класс, а классы называть функциональней, а не просто одним и тем же именем) Логика вся та же, только непонятно: неужели у вас эти классы настолько перегружены, что нужно писать отдельные неймспейсы? То есть все то же самое, только вместо
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
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
12.11.2012, 11:52  [ТС] #17
Цитата Сообщение от Psilon Посмотреть сообщение
Зачем вообще по разным неймспейсам распихивать? Можно все вшить в один класс
Есть софт отображающий видео изображение с разрабатываемых коллегами видео камер.
Количество видеокамер в перспективе не ограничено.
Потребителю передаётся софт с библиотекой его камеры (или тех что уже есть в наличии).
Так же будет ещё и SDK, который бует описывать работу с камерой. Хотя получается, что он будет
унивверсальный.
Сейчас разработка классов под камеры идёт параллельно. и объединяются только файлом интерфейса...

Ну вот не знаю... может быть вы и правы и не нужно городить кучу dll библиотек под каждую камеру...
а ограничиться одной, которую постоянно обновлять и дорабатывать... Но изначально идеология была
такая - для каждой камеры своя dll.
0
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
12.11.2012, 11:55 #18
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
Pyhesty
4 / 4 / 1
Регистрация: 10.07.2011
Сообщений: 52
12.11.2012, 12:26  [ТС] #19
черт... я что-то не подумал об этом... зашоренность...
нужно попробовать...

Добавлено через 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
Psilon
Master of Orion
Эксперт .NET
5989 / 4842 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
12.11.2012, 12:31 #20
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
12.11.2012, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2012, 12:31

Конфликт имен полей таблиц
Есть две таблицы: Person и Teacher. В обеих есть поле ID. Считываю данные через...

Объединение полей из разных таблиц
Вот у меня на скриншотах, 3 таблицы, мне нужно объеденить их, чтоб например на...

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


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

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

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