Можно ли объявлять делегат в одном классе (методы там же), а создавать переменную, присваивать адрес метода, вызывать в другом классе?
Можно ли объявлять делегат в одном классе (методы там же), а создавать переменную, присваивать адрес метода, вызывать в другом классе?
Cитуация следующая,:
Есть неймспейс и два класса, во втором майн. Все методы в первом классе. И хочется объявить делегат и т.д. там, а использовать в другом классе, но как-то не получается, все примеры которые я видел в рамках одного класса...:-(
Есть такое понятие, как "область видимости". Если тип делегата внутри класса, то получить его можно только через экземпляр этого класса, т.е. через объект типа это класса. Чтобы иметь возможность создать делегат в другом классе, надо либо сам делегат вынести из него, либо, как я уже говорил, обратиться к экземпляру класса.
Добрый вечер!
Часть кода,методы на которые указывает делегат в другом классе..если нужен весть..могу выложить
И пишет во всех ошибах про контекст..про горизот ,но как это исправит..Пробовал в том объялять и в этовызывать тоже не получилось..наверное где то ошибся..
evgenyt2000, у Вас делегат объявлен два раза, и глобально, и в классе. Поэтому при создании экземпляра он не понимает на какой ориентироваться. Нужно удалить какой то один. Судя по коду тот, что вверху Вам не нужен. Если же Вы планируете использовать этот делегат где-то еще кроме класса Demo, то оставить надо верхний, но изменить сигнатуру, т.к. сейчас у него сигнатура такова, что он не принимает ни одного параметра. Вы просто вырежте строчку объявления делегата в классе Demo и замените ею верхнюю.
eRKa,
Спаисбо
Сделал ,не помогло...Что вектор не тот тип и имена методов не существуют в данном контектсе,я это уже пробовал делать....объявлять глобально(осталось посл е одной из попыток два экземляра..)
evgenyt2000, дружище, ни у кого нет времени дебажить твой код. Я могу только взглядом пройтись и указать на замеченные ошибки. Я рабочий человек с почасовой оплатой, повышенной ставкой за переработку и кол-вом работы на год вперед. Ты постишь код, говоря об ошибках, причем ни одного текста ошибки написать не можешь, ни одного скрина или еще чего то. Тратить час на то, чтобы создать проект с твоим кодом и найти в нем ошибку, желания нет, мне за это время заплатят штукарь. Если ты пишешь не в блокноте, то студия укажет тебе все конкретные места ошибок, строку и даже команду. При этом расскажет причину и даже может дать совет как это исправить. Тебе остается только загуглить эту причину или сообщение ошибки. Если проблема с английским, то опять таки есть гугл-переводчик.
Вы объявили делегат глобально
delegate double Operation(Vector vector);
Это вообще не понятно от куда такое придумали, это бред
Operation oper = new Operation(Add);
Чтобы использовать делегат, надо создать для него переменную
Operation operation;
И уже ей присваивать методы, причем их сигнатура должна совпадать с объявленной, т.е. (double Operation(Vector vector))
operation = Add
В вашем классе Demo нет методов Add и Razn, откуда они возьмутся вот здесь
new Operation(Add) и oper = Razn
Получить доступ к этим методам можно только через экземпляр класса Vector
operation = a.Add;
operation(new Vector(1,1,1))
Судя по Вашим попыткам, могу судить , что Вы хотите реализовать что-то похожее на стратегию (на паттерн "стратегия"). Мои рекомендации: прежде, чем писать код, прочитайте хоть какие то учебники по .net, тщательнее вникните в ООП, а именно полиморфизм и как он реализуется в конкретных задачах. Далее учитесь дебажить, пользоваться инструментами дебага и гуглить те сообщения об ошибках, которые выдает студия. Поверьте, в последнем случае, Вы быстрее решите проблему, чем задавать вопросы на Тостере.
делегат это тип. и в общем случае вполне может быть использован из другого класса, если он публичный, класс декларатор публичный и его пространство имен подключено. мало того, в самом дотнете есть масса предопределенных типов делегатов, которые прямо таки предназначены, для использования в программистами своем коде, без доступа к исходникам самого дотнета
Вы объявили делегат глобально
в C# не глобального контекста в принципе..
в остальном возможно вы правы. опять же за исключением что
ни у кого нет времени...
но я бы уже взглянул, после столь критичного разбора
А кто вам мешает так делать?.. Делегат можно объявить вообще не в классе, а просто в неймспейсе. Ведь делегат - это просто сигнатура метода (количество и типы аргументов метода).