Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/56: Рейтинг темы: голосов - 56, средняя оценка - 4.68
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504

Запустить функцию одного класса в другом

23.03.2013, 01:17. Показов 11703. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется два класса,нужно получить доступ к функциям одного из другого, при этом экземпляр одного класса в другом нельзя, функцию статическую сделать тоже
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.03.2013, 01:17
Ответы с готовыми решениями:

Указатель на функцию-член одного класса в другом классе - C++
Добрый вечер! Может кто-то может помочь с проблемой. class Cook { public: void _cook_dish(Dish cook_dish_id) { ... ...

Вызов переменной из одного класса в другом
Добрый день! Прошу помощи у знающих людей. Передо мной стоит задача разработки unit-тестов для задач и разработка графического...

Обращение к методу из одного класса в другом
Подскажите, есть ли какая-нибудь возможность обратиться из одного класса в другой, не наследуя при этом полностью этот класс...т.е у меня...

25
45 / 45 / 9
Регистрация: 19.11.2012
Сообщений: 124
23.03.2013, 01:22
Приведи классы, например.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 01:47  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class UnityClient:PeerBase
    {
        private readonly ILogger Log = LogManager.GetCurrentClassLogger();
        public UnityClient(IRpcProtocol protocol, IPhotonPeer peer)
            : base(protocol, peer)
        {
            Log.Debug("Connection unityclient:" + peer.GetRemoteIP());
        }
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            Log.Debug("Disconnected unityclient");
        }
        
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
           
       
        }
 
        public void delevent() // нужно запустить
        {
            SendParameters sendParameters;
            EventData eventdata = new EventData(20);
            eventdata.Parameters = new Dictionary<byte, object> { { 1, "121212" }, { 2, "" }, { 3, "" } };
            SendEvent(eventdata, sendParameters);
        }
        
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
    public class RoomClient:PeerBase
    {
 
        private readonly ILogger Log = LogManager.GetCurrentClassLogger();
        public RoomClient(IRpcProtocol protocol, IPhotonPeer peer)
            : base(protocol, peer)
        {
            Log.Debug("Connection room:" + peer.GetRemoteIP());
        }
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            Log.Debug("Disconnected room");
        }
 
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
 
            try
            {
                
                switch (operationRequest.OperationCode)
                {
                   
                        break;
                    case 100:   //игрок вышел из битвы, нужно удалить его в общем дереве
                        if (operationRequest.Parameters.ContainsKey(1))
                        {
                            
//запустить нужно вот здесь delevent из  другого класса
 
                        }
                        break;
                    default:
                        Log.Debug("Unknown operation room:" + operationRequest.OperationCode);
                        break;
 
                }
            }
            catch ()
            {
                
            }
            finally
            {
 
            }
        }
    }
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
23.03.2013, 01:47
вы не можете запустить нестатический метод без объекта класса. даже если вы будете извлекать метод из класса методами рефлексии, то вам все равно нужно будет передавать контекстный объект для того, чтобы вызвать этот метод
сделайте статическую обвёртку для этого метода:
C#
1
2
3
4
5
6
7
8
9
class A{
   public void Method(){
      Console.WriteLine("Hello world!");
   }
   public static void StaticMethod(){
      A obj = new A();
      obj.Method();
   }
}
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 02:50  [ТС]
сами классы запускаются тут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class PhotonServer : ApplicationBase
    {
 
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
 
            switch (initRequest.LocalPort)
            {
                case Options.PortUnity:
                    return new UnityClient(initRequest.Protocol, initRequest.PhotonPeer);
                    break;
                case Options.PortRoom:
                    return new RoomClient(initRequest.Protocol, initRequest.PhotonPeer);
                    break;
                default:
                    return null;
                   break;
            }
            
        }
        protected override void Setup()
        {
            //Options.gavtor = new List<string>();
 
            
 
            var file = new FileInfo(Path.Combine(BinaryPath, "log4net.config"));
            if (file.Exists)
            {
                LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
                XmlConfigurator.ConfigureAndWatch(file);
            }
        }
        protected override void TearDown()
        {
        }
    }
Добавлено через 43 минуты
Цитата Сообщение от Koran Посмотреть сообщение
вы не можете запустить нестатический метод без объекта класса. даже если вы будете извлекать метод из класса методами рефлексии, то вам все равно нужно будет передавать контекстный объект для того, чтобы вызвать этот метод
сделайте статическую обвёртку для этого метода:
C#
1
2
3
4
5
6
7
8
9
class A{
   public void Method(){
      Console.WriteLine("Hello world!");
   }
   public static void StaticMethod(){
      A obj = new A();
      obj.Method();
   }
}
так дело в том что если сделать статический метод, то ругается на SendEvent, ему нужно знать к чему подключено
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.03.2013, 02:56
Делегаты? В OnOperationRequest передавать функцию delevent в виде ссылки.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 04:43  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Делегаты? В OnOperationRequest передавать функцию delevent в виде ссылки.
эээ а примерчик можно?
мне нужно в отределённый момент что бы происходило, когда код =100
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.03.2013, 07:57
Итить... Что называется, не вник в код в начале. Я так понимаю, при срабатывании operationRequest.OperationCode == case 100, нам нужно удалить некий объект UnityClient из коллекции, не имея на него ссылку?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 08:17
Вариант?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            UnityClient client = new UnityClient();
            RoomClient rc = new RoomClient();
            DelegateManager.Actions.Add("DelEvent", client.DelEvent);
            rc.OnOperationRequest();
 
            Console.ReadKey();
        }
    }
 
    public class UnityClient
    {
        public void DelEvent() // нужно запустить
        {
            Debug.WriteLine("---------- DelEvent ----------");
            Console.WriteLine("---------- DelEvent ----------");
        }
    }
 
    public class RoomClient
    {
        public void OnOperationRequest()
        {
            int number = 100;
            switch (number)
            {
                case 100:   //игрок вышел из битвы, нужно удалить его в общем дереве
                    {
                        DelegateManager.Actions["DelEvent"].Invoke();
                        //запустить нужно вот здесь delevent из  другого класса
 
                    }
                    break;
                default:
 
                    break;
 
            }
        }
    }
 
    static class DelegateManager
    {
        public static Dictionary<string, Action> Actions { get; private set; }
 
        static DelegateManager()
        {
            Actions = new Dictionary<string, Action>();
        }
    }
}
1
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 14:14  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Итить... Что называется, не вник в код в начале. Я так понимаю, при срабатывании operationRequest.OperationCode == case 100, нам нужно удалить некий объект UnityClient из коллекции, не имея на него ссылку?
нет, нужно запустить функцию из класса Unity, просто один класс подключён к одному клиенту, другой к другому, вернее наоборот))
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 14:24
Словарь я сделал, если надо много методов вызывать в разных местах. Такой вариант подходит?
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 15:17  [ТС]
Цитата Сообщение от Casper-SC Посмотреть сообщение
Словарь я сделал, если надо много методов вызывать в разных местах. Такой вариант подходит?
мне классы нужно немного не так объявлять, но я пробую ваш код приспособить

Добавлено через 34 минуты
так вариант каспера работает, но возникла необходимость передавать в функцию delevent значения, в момент вызова
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 15:59
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            UnityClient client = new UnityClient();
            RoomClient rc = new RoomClient();
            DelegateManager.Actions.Add("DelEvent", client.DelEvent);
            DelegateManager.ParametrizedActions.Add("PDelEvent", client.DelEventWithParameters);
            rc.OnOperationRequest();
 
            Console.ReadKey();
        }
    }
 
    public class UnityClient
    {
        public void DelEvent() // нужно запустить
        {
            Debug.WriteLine("---------- DelEvent ----------");
            Console.WriteLine("---------- DelEvent ----------");
        }
 
        public void DelEventWithParameters(object data) // нужно запустить
        {
            Console.WriteLine("---------- DelEventWithParameters ----------");
            Console.WriteLine((string)data);
        }
    }
 
    public class RoomClient
    {
        public void OnOperationRequest()
        {
            int number = 100;
            switch (number)
            {
                case 100:   //игрок вышел из битвы, нужно удалить его в общем дереве
                    {
                        DelegateManager.Actions["DelEvent"].Invoke();
                        DelegateManager.ParametrizedActions["PDelEvent"].Invoke("ВА-А-А-АУ !!!");
                        //запустить нужно вот здесь delevent из  другого класса
 
                    }
                    break;
                default:
 
                    break;
 
            }
        }
    }
 
    static class DelegateManager
    {
        public static Dictionary<string, Action> Actions { get; private set; }
        public static Dictionary<string, Action<object>> ParametrizedActions { get; private set; }
 
        static DelegateManager()
        {
            Actions = new Dictionary<string, Action>();
            ParametrizedActions = new Dictionary<string, Action<object>>();
        }
    }
}
Добавлено через 2 минуты
Цитата Сообщение от kelod Посмотреть сообщение
мне классы нужно немного не так объявлять
Да это вообще не суть, да и я не телепат, сделал лишь компилилось
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 21:27  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch (initRequest.LocalPort)
            {
                case Options.PortUnity:
                    {
                        UnityClient cl=new UnityClient(initRequest.Protocol, initRequest.PhotonPeer);
                        DelegateManager.Actions.Add("DelEvent", cl.delevent);
                        return cl;
                    }
                    break;
                case Options.PortRoom:
                    return new RoomClient(initRequest.Protocol, initRequest.PhotonPeer);
                    break;
                default:
                    return null;
                   break;
            }
при повторном запуске или при подключении второго клиента возникает следущая ошибка

2013-03-23 21:09:30,140 [18] ERROR Photon.SocketServer.ApplicationBase - System.ArgumentException: Элемент с тем же ключом уже был добавлен.

ошибка на вот эту строчку указывает
DelegateManager.Actions.Add("DelEvent", cl.delevent);
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 21:38
Цитата Сообщение от kelod Посмотреть сообщение
Элемент с тем же ключом уже был добавлен
Не наводит на мысли?

Получается, что в словарь нельзя добавить 2 ссылки с одним и тем же ключом. А тебе по сути 1 раз надо сослаться на метод delevent или при каждом поделючении там свой объект cl. Короче, не совсем понятно как оно должно работать. Если 1 раз надо сослаться на метод, то 1 раз добавь в словарь, если каждый раз свой объект, то... Короче, если бы я отлаживал сидел и понимал, что от меня требуется, я бы думаю осилил задачу, а так одни вопросы, что там происходит, какие детали у всего происходящего...

Добавлено через 1 минуту
Возможно словарь вообще не нужен, он нужен, чтобы добавлять разные методы в него и потом их вызывать по уникальному ключу. Так возможно хватит просто делегата Action.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 22:23  [ТС]
вообщем таку меня есть два сервера, один отвечает за меню игроков(битвы, комнаты), другой отвечает за то что происходит в комнатах, эти два сервера связаны между собой как клиент-сервер, сейчас нужно сделать так что бы удалялись игроки из списков на сервере-меню, это я сделал, но так же нужно что бы у других игроков, подключённых к серверу, отображалась информация, о том что такой то игрок ущёл с такой то комнаты, т.е. при дизконнекте игрока и сервера-игра, всем остальным игрокам рассылается событие что игрок вышел, о происходящем я могу узнать в классе Room, но к нему подключен сервер-игра, а нужно разсылать событие из класса подключённого к клиентам, это класс Unity, вот собственно и всё

Добавлено через 3 минуты
по сути мне нужно просто всем игрокам отправлять определённые данные
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 23:02
Ты понимаешь что происходит в этой строке?
C#
1
DelegateManager.Actions.Add("DelEvent", cl.delevent);
Добавлено через 27 секунд
Если да, то напиши что, а не просто: Да.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 23:22  [ТС]
если честно не совсем, в словарь Actions добавляется ключ DelEvent и значение cl.deleven,
я попробывал проверять присудствие ключа в словаре перед добавлением, вроде ошибка пропала, и на сервере всё сработало, но не пойму разослалось ли событие
и может можно как то сделатьбез проверки?

сделал так
C#
1
2
3
4
5
6
UnityClient cl=new UnityClient(initRequest.Protocol, initRequest.PhotonPeer);
                        if (!DelegateManager.Actions.ContainsKey("DelEvent"))
                        {
                            DelegateManager.Actions.Add("DelEvent", cl.delevent);
                        }
                        return cl;
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.03.2013, 23:35
Если это единственное для чего нужен словарь, то (на основе прошлого примера):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            UnityClient client = new UnityClient();
            RoomClient rc = new RoomClient();
 
            if (DelegateManager.Action == null)
                DelegateManager.Action = client.DelEvent;
 
            if (DelegateManager.ParametrizedAction == null)
                DelegateManager.ParametrizedAction = client.DelEventWithParameters;
 
            rc.OnOperationRequest();
 
            Console.ReadKey();
        }
    }
 
    public class UnityClient
    {
        public void DelEvent()
        {
            Console.WriteLine("---------- DelEvent ----------");
        }
 
        public void DelEventWithParameters(object data)
        {
            Console.WriteLine("---------- DelEventWithParameters ----------");
            Console.WriteLine((string)data);
        }
    }
 
    public class RoomClient
    {
        public void OnOperationRequest()
        {
            DelegateManager.Action();
            DelegateManager.ParametrizedAction("ВА-А-А-АУ !!!");
        }
    }
 
    static class DelegateManager
    {
        public static Action Action { get; set; }
        public static Action<object> ParametrizedAction { get; set; }
    }
}
Добавлено через 4 минуты
Цитата Сообщение от kelod Посмотреть сообщение
и может можно как то сделать без проверки?
Ну со вторым вариантом можно. Просто каждый раз присваивать. Тем более, если там каждый раз новый объект и это важно.
0
11 / 11 / 0
Регистрация: 17.01.2013
Сообщений: 504
23.03.2013, 23:37  [ТС]
да он может вообще не нужен) это вы мне его предложили)) я просто не очень хорошо знаю c#
вроде работает, нужно проверить как отправляются события и что приходит, от разных клиентов, щас потестю, если будут вопросы напишу, спасибо за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.03.2013, 23:37
Помогаю со студенческими работами здесь

Использовать метод одного класса в другом
Добрый день, подскажите, как решить проблему. Имеются класс Cat, класс Human, класс House. Необходимо реализовать возможность проверки...

Использование метода из одного класса в другом
Здравствуйте! Проходим классы, все никак не могу понять, как использовать метод из одного класса в другом.. Доходит до меня только на...

Использование метода одного класса в другом
Вопрос вот в чем. Как в классе useEmployee использовать метод описанный в классе Employee? При запуске программы, компилятор никаких ошибок...

Использование объектов из одного класса в другом
Хотелось бы, а скорее необходимо использовать объекты quest и player отсюда using System.Collections; using...

Не видится метод одного класса в другом
Здравствуйте! Ребята подскажите. Что может влиять на то, что метод одного класса не видится в другом классе, если метод прописан...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru