Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Можно ли наследовать объект?


Автор: Rohoss 4.5.2009, 20:15
Скажем так, объект А находится в библиотеке, не известной до момента выполнения приложения. Может ли объект В, быть наследован от объекта А?

Автор: Partizan 4.5.2009, 20:22
Rohoss, наследуются не объекты, а классы....

по САБЖу, наверно можно поиграться с динамической генерацией классов..

Автор: -Mikle- 5.5.2009, 07:43
Да, динамическая генерация, думаю, единственный способ. Просто непонятно Rohoss, каков конечный смысл такой операции? Что даст наследование? Проясни пожалуйста.

Автор: PashaPash 5.5.2009, 13:25
-Mikle-, можно подсовывать B вместо A, например, в целях тестирования. 
Rohoss, погугли Rhino Mocks или moq.

Автор: -Mikle- 5.5.2009, 20:26
Цитата(PashaPash @  5.5.2009,  16:25 Найти цитируемый пост)
-Mikle-, можно подсовывать B вместо A, например, в целях тестирования

Разве это не касается только .NET remoting? Там так можно было делать.

Автор: PashaPash 5.5.2009, 20:46
-Mikle-, не обязательно remoting - это же обычное наследование. 

Автор: -Mikle- 5.5.2009, 22:00
Цитата(PashaPash @  5.5.2009,  23:46 Найти цитируемый пост)
это же обычное наследование

Я так понял, что нужно не обычное:
Цитата(Rohoss @  4.5.2009,  23:15 Найти цитируемый пост)
объект А находится в библиотеке, не известной до момента выполнения приложения. Может ли объект В, быть наследован от объекта А?


Ему нужно наследоваться во время выполнения от А. Причем не ясно зачем такое нужно вообще и каков смысл в классе B, если этот класс заранее не знает, что он будет перегружать или не перегружать.

Remoting позволяет (через ж..у и не документированно естественно) подменить один из базовых типов? например object на MyObject, но это только ради "поиграться", реально я бы не стал этого делать.

Думаю человеку нужно использовать "Композицию" и "Делегирование" (при необходимости) в качестве решения своей задачи.

Автор: PashaPash 6.5.2009, 00:43
-Mikle-, мало ли какие странные задачи могут придти в голову топикастеру. Навскидку - он может заменить все типы из сборки XXX в IoC-контейнере на такие вот "наследники" и обеспечить логгирование или какой-нибудь exception shielding. Типа - хочу чтобы все исключения, бросаемые классами MyFramework.Data.*... оборачивались в DataLayerException с дампом всех параметров. Причем без изменения кода MyFramework.Data.*. Не совсем наследование, скорее реализация тех же интерфейсов/прокси, но средства для достижения - те же.

Автор: -Mikle- 6.5.2009, 18:47
Хорошо, задача имеет определенный смысл, но разве прокси-подобные вещи делаются не путем динамической компиляции? Мне другого и в голову не приходит.

Автор: PashaPash 6.5.2009, 20:54
-Mikle-, ес-но с помощью динамической компиляции. но это не значит что нужно с нуля писать реализацию smile 

Автор: -Mikle- 6.5.2009, 21:06
Ну в общем-то я нигде вроде и не говорил что с нуля.

Автор: Rohoss 10.5.2009, 20:41
Цитата(-Mikle- @  5.5.2009,  07:43 Найти цитируемый пост)
Да, динамическая генерация, думаю, единственный способ. Просто непонятно Rohoss, каков конечный смысл такой операции? Что даст наследование?


Ссори за краткое отсутствие…
Данный вопрос интерес чисто теоретически и не имеет никакой практической надобности… smile 


Автор: diadiavova 11.5.2009, 01:04
Цитата(Rohoss @  10.5.2009,  20:41 Найти цитируемый пост)
Данный вопрос интерес чисто теоретически и не имеет никакой практической надобности

Чисто теоретически, такая возможность есть в некоторых других языках. В частности в javascript предков можно менять динамически, и кстати, там как раз наследуется именно объект и куча других "странностей" присутствует.
Приведу пример
Код

<html>
<head>
    <title>Prototype test</title>
</head>
<body>

    <script type="text/javascript">
        //Первый базовый класс
        function base1() { this.showMessage = function() { alert("I am base1"); } };
        //Второй базовый класс
        function base2() { this.showMessage = function() { alert("I am base2"); } };
        //Класс-потомок
        function child() { };
        //создаём экземпляры базовых классов
        var b1 = new base1();
        var b2 = new base2();
        //Обработчик кликов кнопок
        function btn_click(src)
        {
            //Если нажата первая кнопка назначам для child предка b1(экземпляр base1)
            //в ином случае - b2(экземпляр base2)        
            child.prototype = (src.id == "btn1") ? b1 : b2;
            //Создаём экземпляр класса child
            var test = new child();
            //Вызываем метод базового класса
            test.showMessage();
        }


    </script>

    <input id="btn1" type="button" value="show base1" onclick="btn_click(this);">
    <input id="btn2" type="button" value="show base2" onclick="btn_click(this);">
    <br>
    <span id="result"></span>
</body>
</html>



Здесь у меня два класса - предка(base1 и base2) и один пустой класс-потомок(child). На страничке две кнопки с одним обработчиком. В зависимости от того, какая кнопка нажата, классу child назначается (посредством экземпляров) тот или иной родитель, после чего создаётся экземпляр класса child и у него вызывается метод, определённый в обоих родителях, но по-разному. Результат можно увидеть, если запустить пример.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)