Как передать в метод экземпляр класса
Перейти к содержимому

Как передать в метод экземпляр класса

  • автор:

Как передать объект любого класса в метод?

как мне понять какой объект обращается и как ним потом манипулировать?

  • Вопрос задан более двух лет назад
  • 124 просмотра

Комментировать

Решения вопроса 1

twobomb

Ну вродебы все же префабы наследуются от GameObject’a?
Можно типа такого

public void CellClick(GameObject o) < if(o.GetType() == typeof(Car))< Car car = (Car)o ; //todo >if(o.GetType() == typeof(Animal)) < Animal animal= (Animal)o ; //todo >>

Если манипуляции однотипные, то можно интерфейсы прикрутить

Ответ написан более двух лет назад

Нравится 1 4 комментария

Zefirot

Zefirot @Zefirot Автор вопроса

public void CellClick(GameObject Obj) <

error CS1503: Argument 1: cannot convert from ‘Test1’ to ‘UnityEngine.GameObject’

twobomb

Zefirot, Ну Test1 у вас наследуется от MonoBehaviour, а вам нужно передавать GameObject. Ну если нужно передавать экземпляр класса Test1 тогда так.

public void CellClick(MonoBehaviour o) < if(o.GetType() == typeof(Test1 ))< Test1 test1= (Test1 )o ; //todo >if(o.GetType() == typeof(Test2 )) < Test2 test2= (Test2)o ; //todo >>

ReyGrau

twobomb, Можно сделать код короче

public void CellClick(MonoBehaviour o) < if(o is Test1 test))< test.DoSomething(); //todo >if(o is Test2 test)) < test.DoSomething() ; //todo >>

twobomb

ReyGrau, Ну если нужен только DoSomething. То проще

public class Test2 : MonoBehaviour, IPointerClickHandler, IMyDoSomething

Хотя судя по коду вообще можно
this.DoSomething()
Потому как в месте вызова CellClick текущий контекст находится в этом же классе, мы делаем бесполезные действия.

Как передать в метод экземпляр класса

1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.

Модераторы: B.V., Qraizer
'> Классы: как передать метод класса как callback-функцию?

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

Сообщ. #1 , 16.04.09, 08:56

Рейтинг (т): 506

Можно выделить несколько видов ситуаций, когда возникает подобного рода задача. Каждый из них должен быть рассмотрен отдельно. Общее же для всех ситуаций заключается в том, что метод класса не есть обычная функция. У него другое соглашение о вызове (calling conversion), заключающееся в том, что в качестве первого параметра обязательно передается указатель на экземпляр класса, для которого должен вызываться метод. А потому всегда:
- Указатель на метод класса нельзя передать туда, где требуется указатель на свободную функцию (пусть даже с такой же сигнатурой);
- Сохранения только указателя на метод класса недостаточно. Для вызова метода необходимо иметь указатель на экземпляр класса;
- Вызов метода класса по указателю осуществляется с помощью оператора "доступ к члену по указателю" ('.*' или '->*'), где слева стоит объект класса, а справа - указатель на член класса (pointer-to-member). В нашем случае - указатель на метод класса.
Далее будут рассмотрены несколько различных ситуаций, где задача сохранения указателя на метод и указатель на экземпляр будут решаться чуть-чуть по-разному. Различие (в основном) заключается в поведении вызывающей стороны (т. е. той стороны, которая будет вызывать метод класса по указателю). А от этого может зависит то, что нужно будет сделать на вызываемой стороне (т. е. в классе, метод которого будет вызываться по указателю).

1. Функция-делегат.
Эта ситуация характерна следующим. Вызывающая сторона имеет возможность сохранить у себя как указатель на метод класса, так и указатель на объект класса, для которого будет вызываться этот метод. Следовательно, когда происходит связывание (передача указателей вызываемой стороны вызывающей стороне), тем или иным образом передается как указатель на метод, так и указатель на объект. Например:

Как передать объект в метод java

Для передачи объекта в метод необходимо объявить параметр метода, который будет принимать объект нужного типа. Например:

public void someMethod(MyObject obj)  // тело метода > 

В данном примере метод someMethod принимает объект класса MyObject , передаваемый в качестве аргумента метода. Чтобы передать объект в метод, необходимо создать экземпляр класса, и использовать его в качестве аргумента метода. Например:

MyObject obj = new MyObject(); someMethod(obj); 

Здесь мы создали экземпляр класса MyObject и передали его в метод someMethod . Внутри метода someMethod мы можем работать с переданным объектом, вызывая его методы или обращаясь к его полям.

Как передать указатель на метод экземпляра класса, как параметр конструктора?

Добрый вечер, подскажите.
Я написал класс чтения из pipe и заметил, что сообщения дробятся, по этому я решил создать класс буферизатора, который будет накапливать прочтенные данные. Класс, читающий данные из pipe, в своем конструкторе имеет параметр, указывающий, какую функцию надо вызвать, когда приходят данные и туда я хочу передать функцию из класса буферизатора. Напрямую это сделать нельзя, так как функция экземпляра не является static. Я начал читать про путь с использованием подставного callback, но потом наткнулся, что можно использовать std::function и std::bind. Вот это я и попытался сделать, но так и не понял, как довести дело до ума.
В классе, который читает данные из pipe я определил

class NamedPipeClass < NamedPipeClass(char* _pipeName, bool isClient, std::functionReadCallBack) < . onReadCallback = ReadCallBack; >; std::function onReadCallback; >

И создавая экземпляр класса

MessageCollectorClass* msgCollector = new MessageCollectorClass(); NamedPipeClass* hltPipe = new NamedPipeClass(myfifo, true, std::bind(&msgCollector::AddData, this, std::placeholders_1));

но это не правильно. Подскажите, как это сделать корректно?

  • Вопрос задан более трёх лет назад
  • 790 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *