LINUX.ORG.RU

[C#] Приведение типов при наследовании


0

1

Здравствуйте, уважаемые форумчане и форумчанки. У меня к вам следующий вопрос: есть к примеру, такой код

Foo foo = new Bar()
, где Foo класс-предок, а Bar - наследник. Как при этом в C# преобразовать исходный тип Foo сразу же к типу Bar?

Явных указаний на эту тему я в Гугле и учебниках пока не нашел, хотя допускаю, что мог просто плохо читать. Нашел только, что в такой ситуации будет автоматом выполнено преобразование типа Bar -> Foo, но мне нужно наоборот. Извините за сумбурное изложение, вечер уже все-таки.

Заранее благодарен за ваши ответы.

Ответ на: комментарий от LongLiveUbuntu

Похоже я понял чем ТС задрал тут всех.
ТС, такое возможно ТОЛЬКО в случае языка с динамической типизацией. Джава является языком со статической типизацией, так что забудь.

FollowTheRabbit
()
Ответ на: комментарий от Booster

Фееричная тема.

Топикстартер, то, чего ты хочешь, называется динамическая типизация, и есть в языках вроде JavaScript (с которым ты, возможно, перепутал Java), Python, PHP и др. В этом случае метод действительно ищется во время выполнения программы, и при компиляции никаких проверок на его существование не производится. Java и C# - статически типизированные языки. Если переменная имеет тип Map, то она может вызывать только методы, объявленные в интерфейсе Map (и в его родительских интерфейсах). То, что реально этот метод реализован в классе HashMap, называется полиморфизмом. Но это ни в коей мере не позволит вызвать метод, специфичный для HashMap, но не объявленный в Map. Чтобы вызвать подобный метод, нужно явно указать компилятору, что мы имеем дело с HashMap, скастовав к нему наше значение.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В C# есть динамическая типизация. Только то о чём здесь пишут, является какой-то дикой смесью статической и динамической типизации. Вроде как тип указан явно, но в то же время это другой тип. ^)

Booster ★★
()
Ответ на: комментарий от RedPossum

Я не знаю, что там у ТС.

вызываться будут методы того объекта, на который указывает эта ссылка

$ cat cpp.cpp 
#include <iostream>

class Foo {
public:
    void blah() {
        std::cout << "Me is foo";
    }
};

class Bar : public Foo {
public:
    void blah() {
        std::cout << "Me is bar";
    }
};


int main() {
    Foo *foo=new Bar();
    foo->blah();
}

$./a.out
Me is foo
anonymous
()
Ответ на: комментарий от anonymous

и я не знаю что там у ТС'а, но подозреваю он совсем не про полиморфизм и перегрузку, а про что-то другое.

RedPossum ★★★★★
()
Ответ на: комментарий от anonymous

virtual забыл. в Java все методы virtual, в плюсах надо явно указывать. Иначе не овверайдится.

roy ★★★★★
()

Извиняюсь перед всеми теми, кого я достал, но мне больше не к кому было обратиться, серьезно. В гугле пробовал искать, но не допер, что это динамическая типизация и есть )) Всем спасибо. Еще раз извините за мою тупость, вот такой я слоупок )

LongLiveUbuntu ★★★★★
() автор топика

Вообще, у меня сейчас куча вопросов по .Net, C# и GTK+. Пытаюсь их разрешать самостоятельно, но пока не очень получается.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Нашел как сделать.

var foo = new Bar();

А дальше без явного приведения типов можно работать с foo как с объектом типа Bar.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Тьфу ты.

Вот это называется не «динамическая типизация», а «вывод типов». Убогий, правда, но уж какой есть.

Miguel ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Угу, в Haskell вывод типов на порядок круче.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.