Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение ссылки на объект из ссылки на интерфейс 
V
    Опции темы
0leg
Дата 1.12.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Если есть ссылка на интерфейс, можно ли по ней получить объект, реализующий этот интерфейс явным приведением типов? 

Есть ли какие-то особенности в использовании этой ссылки? В частности, при сериализации полученного таким образом объекта? 

Я этим пользуюсь, на первый взгляд вроде все работает. Но сериализации иногда не идет. 

Пример кода: 

Код



   public interface IMy 
   { 
   ..... 
   } 

   public class My: IMy 
   { 
   ..... реализация интерфейса IMy.... 
   ..... собственные поля и методы ....... 
   } 

   public class ClassA 
   { 
      public IMy Add(string Name) 
      { 
         My res = new My(); 
         return My; 
      } 
   } 
    
   public class ClassB 
   { 
      public void Metod() 
      { 
         ClassA a = new ClassA(); 

         // ТАК МОЖНО ??????????    
         My m = (My) a.Add("новый класс"); 
      } 
   }


PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  1.12.2006,  08:23 Найти цитируемый пост)
         // ТАК МОЖНО ??????????    
         My m = (My) a.Add("новый класс"); 

Можно, но если ты 100%  smile уверен, что нечто, которое реализовало интерфейс IMy, является объектом типа My или его потомком.

Проверить это можно спросив: a.Add("новый класс").GetType().ToString()

Но это нехорошая практика. Таким образом ты снимаешь все преимущества использования интерфейса IMy 
Тебе все равно есть он или его нет

Добавлено @ 10:38 
0leg, лучший вариант проверить ---- забить в программу и глянуть выскочило ли исключение  smile 
PM MAIL WWW ICQ   Вверх
0leg
Дата 1.12.2006, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  10:37 Найти цитируемый пост)
Но это нехорошая практика. Таким образом ты снимаешь все преимущества использования интерфейса IMy 


Нет, я не снимаю преимущества IMy! У меня есть две библиотеки - в одной объявлен набор интефейсов, в другой - классы, реализующие эти интерфейсы. Причем методы этих классов в качестве параметров иногда возвращают интерфейсы. И эти же самые методы используются для общения классов между собой. Примерно так:

Код

// ============== БИБЛИОТЕКА КЛАССОВ 1 =====================

interface IMy{...};
interface IClassA
{
  IMy Add(string Name);
  ...
};
interface IClassB{...};

// ============== БИБЛИОТЕКА КЛАССОВ 2 =====================
   public class My: IMy 
   { 
   ..... реализация интерфейса IMy.... 
   ..... собственные поля и методы ....... 
   } 

   public class ClassA: IClassA
   { 
      public IMy Add(string Name) 
      { 
         My res = new My(); 
         return My; 
      } 
   } 
    
   public class ClassB: IClassB
   { 
      public void Metod() 
      { 
         ClassA a = new ClassA(); 

         // МНЕ НАДО ПОЛУЧИТЬ ИМЕННО КЛАСС, а другой Add писать неохота
         My m = (My) a.Add("новый класс"); 
      } 
   }

PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



0leg, ты черезчур увлекся интерфейсами.
IClassA и IClassB --- явно лишнее.
Тоже самое, ИМХО, с IMy.
Что тебе мешает сделать просто классы  smile 

Интерфейсы нужны только для того, чтобы дать классу второго (третьего,...) родителя или добавить классу некую функциональность, которая так же может быть реализована и в других (совсем посторонних класса).
Но только в этом случае smile 
У тя явный перебор  smile 


PM MAIL WWW ICQ   Вверх
0leg
Дата 1.12.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  11:30 Найти цитируемый пост)
Интерфейсы нужны только для того, чтобы дать классу второго (третьего,...) родителя или добавить классу некую функциональность, которая так же может быть реализована и в других (совсем посторонних класса).Но только в этом случае  У тя явный перебор   

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

По поводу приведения типов - спасибо, дело  оказалось в другом. Щас наверно новый топик забубеню...  smile 
PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  1.12.2006,  11:24 Найти цитируемый пост)
я не говоил, что интерфейсы IClassA и IClassB будут реализовываться однократно

Последний вопрос и я от тебя отстану:
Классы, реализующие интерфейс IClassA, имеют другого родителя или нет?
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 1.12.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



0leg, а что не сериализуется ? И какой способ сериализации используется (бинарная, XML ?). Надо бы пример кода.


--------------------
user posted image
PM MAIL WWW   Вверх
0leg
Дата 1.12.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  12:27 Найти цитируемый пост)
Классы, реализующие интерфейс IClassA, имеют другого родителя или нет?

нет, не имеют. Предлагаешь абстрактные классы?

Я книжку читал - "полный справочник C# Шилдта" (правда он далеко не полный...), там написано: 
"Если вы полностью описываете действия класса и не нужно уточнять как он это делает, следует использовать интерфейс. Если требуется включить в описание детали реализации - имеет смысл использовать абстрактный класс".


Цитата(mr.DUDA @  1.12.2006,  12:34 Найти цитируемый пост)
0leg, а что не сериализуется ? И какой способ сериализации используется (бинарная, XML ?). Надо бы пример кода.

сриализация Xml, но уже понял что дело не в ней. Класс, котрый пытаюсь серить какой-то кривой. Сделаю щас тему другую... (если еще не надоел  smile )
PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  1.12.2006,  12:17 Найти цитируемый пост)
нет, не имеют. Предлагаешь абстрактные классы?

Скорее всего да smile И, возможно, не абстрактные, а вполне реальные smile
Все зависит от того, что умеет должен уметь делать твой класс.

Можно его код сюда получить?
PM MAIL WWW ICQ   Вверх
0leg
Дата 1.12.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  13:31 Найти цитируемый пост)
Можно его код сюда получить?


список интерфейсов(особое внимание на методы Add):

Код

public interface IDatabase
    {
        void Initialize(IClassList ClassList);
        void Connect(string ConStr, string UserName, string Password);
        bool TestConnect(string ConStr);
        void Disconnect();
        void Install(string ConStr);
        void Uninstall(string ConStr);
        bool Connected { get;}
        string Name { get;}
        string Description { get;}

        IObjects Objects { get;}
        IUsers Users { get;}
        IUserGroups UserGroups { get;}
    }

    public interface IObjects
    {
        int Count { get;}
        IObject this[int ind] { get;}

        IObject Add(string Name, Type Class, bool IsGroup);
        void RemoveAt(int Index);
        void Remove(IObject Obj);
        void Clear();
    }

    public interface IObject
    {
        bool IsGroup { get;}
        int Id { get;}
        int Ord { get;set;}
        int ParentId { get;set;}
        string Name { get;set;} 
        string Code { get;set;}
        string ClassName { get;}
        Type ClassType { get; }

        object Load();
        void Save();
        

        UserRights GetRights(int UserGroupId);
        UserRights SetRights(int UserGroupId);
    }


    public interface IUsers
    {
        int Count { get;}
        IUser ActiveUser { get; }
        IUser this[int ind] { get;}
        IUser this[string Name] { get;}
        IUser Add(string Name);
        void DeleteByInd(int Index);
        void DeleteById(int Id);
        void Clear();
    }

    public interface IUser
    {
        int Id{ get;}
        int Ord { get;set;}
        string Name{ get;set;}
        byte[] Password { get;set;}
        IUserGroup Group { get; }
        int GroupId{ get;set;}    
        bool Enabled{ get;set;}
        bool AllowDelete{get;}
        bool Active { get; }    
    }

    public interface IUserGroups
    {
        int Count { get;}
        IUserGroup this[int ind] { get;}
        IUserGroup this[string Name] { get;}

        IUserGroup Add(string Name);
        void DeleteByInd(int Index);
        void DeleteById(int Id);
        void Clear();
    }

    public interface IUserGroup
    {
        int Id { get;}
        int Ord { get; set;}
        string Name { get; set;}
        bool Enabled { get; set;}

        bool AdmRights{ get; set;}
        bool AllowDelete{ get;}    
        UserRights DefRightsForGroups { get; set;}
        UserRights DefRightsForObjects { get; set;}
        UserRights DefRightsForChannels { get; set;}
    }

    public enum UserRights
    {
        None = 0,
        View = 1,
        Full = 2
    }



Добавлено @ 14:29 
Сверхзадача такая: нужен доступ к БД любого типа, хранящей объекты любого типа в виде древовидного списка (объекты с IsGroup=true могут содержать другие объкты).

Если есть замечания по "Всему Этому" вцелом, рад буду выслушать. smile
PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



0leg, что я могу сказать. Конечно нужно делать абстрактные классы (если у тебя будет несколько юзеров разного типа) или реальные (если класс юзер будет единственный).

Почему:
На примере класса User:
Код

    public interface IUser
    {
        int Id{ get;}
        int Ord { get;set;}
        string Name{ get;set;}
        byte[] Password { get;set;}
        IUserGroup Group { get; }
        int GroupId{ get;set;}    
        bool Enabled{ get;set;}
        bool AllowDelete{get;}
        bool Active { get; }    
    }

ID, Ord, Name, ... --- зачем каждый раз реализовывать свойство ID в классе, если реализация будет всегда одна и та же?
Врядли что-то из этих полей будет реализовываться по разному  smile 
Но даже если будут, то можно будет сделать их virtual

Все остальное аналогично  smile 
PM MAIL WWW ICQ   Вверх
0leg
Дата 1.12.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  15:59 Найти цитируемый пост)
ID, Ord, Name, ... --- зачем каждый раз реализовывать свойство ID в классе, если реализация будет всегда одна и та же?Врядли что-то из этих полей будет реализовываться по разному   Но даже если будут, то можно будет сделать их virtual

Все-равно нечуствую преимуществ абстрактных классов smile . Да, эти поля реализуются просто, например так:
Код


public class ImpUser: IUser
{
    int fId;
    int fOrd;

    public int Id
    {
        get { return fId; }
    }

    public int Ord
    {
        get{return fOrd;}
    }
    
    ................................

}



Но если я реализую это в базовом классе, то его наследникам придётся напрямую обращаться к полям fId, fOrd для установки значений свойств. Это явно усложняет структуру класса-наследника. Теперь при реализации класса-наследника разработчику нужно знать не только какие свойства были унаследованы, но и переменные, в которых храняться значения этих свойств.

з.ы.

как тут табуляцию в код вставлять? ctrl+c, ctrl+v ?
PM MAIL   Вверх
ivashkanet
Дата 1.12.2006, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  1.12.2006,  21:08 Найти цитируемый пост)
Все-равно нечуствую преимуществ абстрактных классов

В самом деле не чувствуешь  smile 
Вся прелесть базового класса заключается в том, что тебе не надо реализовывать то, что было реализовано в базовом
Пример:
Код

    public class BaseClass
    {
        protected int fId;
        protected int fOrd;
        public int Id
        {
            get { return fId; }
        }
        public virtual int Ord
        {
            get { return fOrd; }
        }
    }

    public class MyClass: BaseClass
    {
        
    }


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

У него есть свойства Ord и Id, поля fId, fOId. Так как будто их определили в этом классе.

Таким образом мы можем заранее реализовать всю общую функциональность в базовом классе. 
И далее не заботиться о ней, а работать реализовывать только с новую функциональность класса.
Мы даже можем переопределить свойство Ord (если нужно).
В случае же с интерфейсами нам приходиться делать всю работу с нуля.

Пример: При работе с формой в VS мы наследуемся от от базового класса Form.
Только представь, что бы было, если бы этот класс был бы интерфейсом.
PM MAIL WWW ICQ   Вверх
0leg
Дата 2.12.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.11.2006

Репутация: 1
Всего: 1



Цитата(ivashkanet @  1.12.2006,  23:13 Найти цитируемый пост)
В самом деле не чувствуешь

зараз адчуў !!! smile 

После глубокого внутреннего самоанализа обнаружил у себя нездоровую привязанность к интерфейсам.

Спасибо.

p.s.

Не заставляйте детей программировать COM-объекты!
PM MAIL   Вверх
ivashkanet
Дата 2.12.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(0leg @  2.12.2006,  16:39 Найти цитируемый пост)
Спасибо.

Не за что smile Заходи еще  smile 
Цитата(0leg @  2.12.2006,  16:39 Найти цитируемый пост)
зараз адчуў !!!

Аааа, земляк smile smile  smile 

Это сообщение отредактировал(а) ivashkanet - 2.12.2006, 18:15
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1167 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.