Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Получение ссылки на объект из ссылки на интерфейс |
Автор: 0leg 1.12.2006, 09:23 | ||
Если есть ссылка на интерфейс, можно ли по ней получить объект, реализующий этот интерфейс явным приведением типов? Есть ли какие-то особенности в использовании этой ссылки? В частности, при сериализации полученного таким образом объекта? Я этим пользуюсь, на первый взгляд вроде все работает. Но сериализации иногда не идет. Пример кода:
|
Автор: ivashkanet 1.12.2006, 10:37 |
Можно, но если ты 100% ![]() Проверить это можно спросив: a.Add("новый класс").GetType().ToString() Но это нехорошая практика. Таким образом ты снимаешь все преимущества использования интерфейса IMy Тебе все равно есть он или его нет Добавлено @ 10:38 0leg, лучший вариант проверить ---- забить в программу и глянуть выскочило ли исключение ![]() |
Автор: ivashkanet 1.12.2006, 11:30 |
0leg, ты черезчур увлекся интерфейсами. IClassA и IClassB --- явно лишнее. Тоже самое, ИМХО, с IMy. Что тебе мешает сделать просто классы ![]() Интерфейсы нужны только для того, чтобы дать классу второго (третьего,...) родителя или добавить классу некую функциональность, которая так же может быть реализована и в других (совсем посторонних класса). Но только в этом случае ![]() У тя явный перебор ![]() |
Автор: 0leg 1.12.2006, 12:24 | ||
я не говоил, что интерфейсы IClassA и IClassB будут реализовываться однократно. У них будет несколько вариантов реализации - для каждого варианта своя библиотека. И вполне возможно, реализующие классы будут иметь еще одного родителя (кто их знает?) По поводу приведения типов - спасибо, дело оказалось в другом. Щас наверно новый топик забубеню... ![]() |
Автор: ivashkanet 1.12.2006, 12:27 | ||
Последний вопрос и я от тебя отстану: Классы, реализующие интерфейс IClassA, имеют другого родителя или нет? |
Автор: mr.DUDA 1.12.2006, 12:34 |
0leg, а что не сериализуется ? И какой способ сериализации используется (бинарная, XML ?). Надо бы пример кода. |
Автор: 0leg 1.12.2006, 13:17 | ||||
нет, не имеют. Предлагаешь абстрактные классы? Я книжку читал - "полный справочник C# Шилдта" (правда он далеко не полный...), там написано: "Если вы полностью описываете действия класса и не нужно уточнять как он это делает, следует использовать интерфейс. Если требуется включить в описание детали реализации - имеет смысл использовать абстрактный класс".
сриализация Xml, но уже понял что дело не в ней. Класс, котрый пытаюсь серить какой-то кривой. Сделаю щас тему другую... (если еще не надоел ![]() |
Автор: ivashkanet 1.12.2006, 13:31 |
Скорее всего да ![]() ![]() Все зависит от того, что умеет должен уметь делать твой класс. Можно его код сюда получить? |
Автор: 0leg 1.12.2006, 14:15 | ||
список интерфейсов(особое внимание на методы Add):
Добавлено @ 14:29 Сверхзадача такая: нужен доступ к БД любого типа, хранящей объекты любого типа в виде древовидного списка (объекты с IsGroup=true могут содержать другие объкты). Если есть замечания по "Всему Этому" вцелом, рад буду выслушать. ![]() |
Автор: ivashkanet 1.12.2006, 15:59 | ||
0leg, что я могу сказать. Конечно нужно делать абстрактные классы (если у тебя будет несколько юзеров разного типа) или реальные (если класс юзер будет единственный). Почему: На примере класса User:
ID, Ord, Name, ... --- зачем каждый раз реализовывать свойство ID в классе, если реализация будет всегда одна и та же? Врядли что-то из этих полей будет реализовываться по разному ![]() Но даже если будут, то можно будет сделать их virtual Все остальное аналогично ![]() |
Автор: 0leg 1.12.2006, 22:08 | ||||
Все-равно нечуствую преимуществ абстрактных классов ![]()
Но если я реализую это в базовом классе, то его наследникам придётся напрямую обращаться к полям fId, fOrd для установки значений свойств. Это явно усложняет структуру класса-наследника. Теперь при реализации класса-наследника разработчику нужно знать не только какие свойства были унаследованы, но и переменные, в которых храняться значения этих свойств. з.ы. как тут табуляцию в код вставлять? ctrl+c, ctrl+v ? |
Автор: ivashkanet 1.12.2006, 23:13 | ||
В самом деле не чувствуешь ![]() Вся прелесть базового класса заключается в том, что тебе не надо реализовывать то, что было реализовано в базовом Пример:
В классе MyClass мы не написали ни одной строчки, но он у него есть все атрибуты базового класса. У него есть свойства Ord и Id, поля fId, fOId. Так как будто их определили в этом классе. Таким образом мы можем заранее реализовать всю общую функциональность в базовом классе. И далее не заботиться о ней, а работать реализовывать только с новую функциональность класса. Мы даже можем переопределить свойство Ord (если нужно). В случае же с интерфейсами нам приходиться делать всю работу с нуля. Пример: При работе с формой в VS мы наследуемся от от базового класса Form. Только представь, что бы было, если бы этот класс был бы интерфейсом. |
Автор: 0leg 2.12.2006, 17:39 |
зараз адчуў !!! ![]() После глубокого внутреннего самоанализа обнаружил у себя нездоровую привязанность к интерфейсам. Спасибо. p.s. Не заставляйте детей программировать COM-объекты! |
Автор: ivashkanet 2.12.2006, 18:14 |
Не за что ![]() ![]() Аааа, земляк ![]() ![]() ![]() |