Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
есть класс для работы с карточкой
public class IA3178
{

   IADevices ia_devs = new IADevices();
   IADevice ia_device;

    IADevice[] ia_devices;

    public IA3178()
    {

    }

     public int GetDevices()
     {
            
     }

    public DeviseInfo GetDeviceInfo(int device_num)
    {
            
    }

    public void Init()
    {

    }

    public void SetOutput(int rel_num, bool state)
    {

    }

}


я могу создать несколько карточек и работать с ними
IA3178 card1 = new IA3178 ();
IA3178 card2 = new IA3178 ();

card1.Init();
card1.SetOutput(5, true);


но метод нахождения карточек в сети GetDevices() - он общий для всех карточек и я хочу его вызвать на уровне класса
IA3178.GetDevices();

а не
card1.GetDevices();

как это сделать? он должен быть статический? и тогда все объекты с которыми он работает должны быть статическими?
29 апр 21, 10:13    [22316153]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
он должен быть статический?
да
jenya7
и тогда все объекты с которыми он работает должны быть статическими?
нет
29 апр 21, 10:23    [22316158]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
он должен быть статический?
да
jenya7
и тогда все объекты с которыми он работает должны быть статическими?
нет

нет? а почему я получаю
Error CS0120 An object reference is required for the non-static field, method, or property 'IA3178.ia_devs'
29 апр 21, 10:27    [22316161]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4986
jenya7



как это сделать? он должен быть статический?

Да, можно еще метод-расширение.

jenya7

и тогда все объекты с которыми он работает должны быть статическими?

Нет.
29 апр 21, 10:27    [22316162]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
private string Message { set; get; }
private int DeviceCount { set; get; }

IADevices ia_devs = new IADevices();
IADevice ia_device;

IADevice[] ia_devices;

static public int GetDevices()
        {
            IAError ia_err = ia_devs.DetectAllDevices();
            int idx = 0;

            if (ia_err != IAError.IA_OK)
            {
                Message = ia_devs.GetErrorMessage(ia_err);
                return 0;
            }

            if (ia_devs.Devices.Count == 0)
            {
                Message = "No device found";
                return 0;
            }
            else
            {
                DeviceCount = ia_devs.Devices.Count;

                ia_devices = new IADevice[DeviceCount];

                foreach (IADevice dev in ia_devs)
                {
                    //get the first device with DI functions
                    if (dev.HasDigitalInput || dev.HasDigitalOutput)
                    {
                        if (idx < DeviceCount)
                            ia_devices[idx++] = dev;
                    }
                }

                return DeviceCount;
            }
        }

на все объекты я получаю
An object reference is required for the non-static field, method, or property -------
29 апр 21, 10:32    [22316166]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
An object reference is required for the non-static field, method, or property -------
все экземплярные объекты можно передать через параметры метода, если это необходимо

А на самом деле, ты сам-то понимаешь, что ты хочешь сделать?
Ты вызываешь метод, не зависящий от экземпляра, но хочешь оперировать полями конкретного экземпляра?
Продумай сначала, что ты хочешь сделать.
29 апр 21, 10:41    [22316173]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
An object reference is required for the non-static field, method, or property -------
все экземплярные объекты можно передать через параметры метода, если это необходимо

А на самом деле, ты сам-то понимаешь, что ты хочешь сделать?
Ты вызываешь метод, не зависящий от экземпляра, но хочешь оперировать полями конкретного экземпляра?
Продумай сначала, что ты хочешь сделать.

так а как сделать? это же общий метод для всех экземпляров.
29 апр 21, 10:43    [22316177]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
это же общий метод для всех экземпляров.
еще раз. Если это общий метод для всех экземпляров, он не может оперировать какими либо полями экземпляров. Ну это логично же? Экземпляров может быть сто, а может не быть ни одного.
Опиши словами, что должен делать этот метод.
29 апр 21, 10:44    [22316179]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
Shocker.Pro
он не может оперировать какими либо полями экземпляров
точнее, может, конечно, но тогда ему этот экземпляр нужно передать через параметр метода
29 апр 21, 10:49    [22316182]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
Shocker.Pro
он не может оперировать какими либо полями экземпляров
точнее, может, конечно, но тогда ему этот экземпляр нужно передать через параметр метода

сделал все поля статическими. пока проблем нет.
29 апр 21, 11:09    [22316191]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
jenya7,
тут фабрика напрашивается
+ комплексное управление всеми девайсам.
IA3178 card1 = FactoryIA3178.GetDevice(ip,port);
IA3178 card2 = FactoryIA3178.GetDevice(ip,port);
FactoryIA3178.Foo();
FactoryIA3178.Dispose();

подумайте, может и наружу их вытаскивать не надо, а вытащить только события работы девайса

сделал все поля статическими. пока проблем нет.
самый страшный кошмар

Сообщение было отредактировано: 29 апр 21, 11:18
29 апр 21, 11:19    [22316197]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
jenya7
сделал все поля статическими. пока проблем нет.

Лепота.
29 апр 21, 11:38    [22316212]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Где-то в степи
jenya7,
тут фабрика напрашивается
+ комплексное управление всеми девайсам.
IA3178 card1 = FactoryIA3178.GetDevice(ip,port);
IA3178 card2 = FactoryIA3178.GetDevice(ip,port);
FactoryIA3178.Foo();
FactoryIA3178.Dispose();

подумайте, может и наружу их вытаскивать не надо, а вытащить только события работы девайса

сделал все поля статическими. пока проблем нет.
самый страшный кошмар


прекрасно. но перед FactoryIA3178.GetDevice(ip,port); мне надо найти все подключенные девайсы. для этого нужен метод GetDevices().
29 апр 21, 12:06    [22316230]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
jenya7,
Можно я за вас попишу? ))
все что вам там нужно проверять, это за вас фабрика делает, она просто возврашает инстанс, или элегантно посылает ( ну типа exception)
зы если такой девайс существует, она просто не будет новый создавать, а вернет на него ссылку ( вы чо тупите)

Сообщение было отредактировано: 29 апр 21, 12:19
29 апр 21, 12:24    [22316242]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
сделал все поля статическими. пока проблем нет.

В печь.

Сообщение было отредактировано: 29 апр 21, 12:37
29 апр 21, 12:45    [22316268]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
гы Чтоб ты жил на одну зарплату! имел всегда статические поля!
29 апр 21, 12:48    [22316272]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Где-то в степи
jenya7,
Можно я за вас попишу? ))
все что вам там нужно проверять, это за вас фабрика делает, она просто возврашает инстанс, или элегантно посылает ( ну типа exception)
зы если такой девайс существует, она просто не будет новый создавать, а вернет на него ссылку ( вы чо тупите)


давайте из фантазий спустимся в реалии. посмотрите на GetDevices(). метод ia_devs.DetectAllDevices(); возвращает все девайсы.
я их засовываю в массив девайсов, да статический, а что в этом страшеого?
а потом девайс инициализируется по индексу
 public bool Init(int device_num)
        {
            Connected = false;

            if (device_num < DevicesCount)
            {
                if (ia_devices[device_num] != null)
                {
                    ia_device = ia_devices[device_num];
                    Connected = true;
                }
                else
                    return false;
            }
            else
                return false;

            return Connected;
        }

и потом работаю с этим девайсом
 public bool SetPin(int pin_idx, bool state)
        {
            IAError ia_err;

            if (ia_device != null)
            {
                ia_err = ia_device.WriteDOChannel(pin_idx, state);
                Message = ia_device.GetErrorMessage(ia_err);

                if (ia_err != IAError.IA_OK)
                    return false;
            }
            else
            {
                Message = DEVICE_IS_NULL;
                return false;
            }

            return true;
        }

позвольте! у меня все ходы записаны всё инкапсулированно.

Сообщение было отредактировано: 29 апр 21, 13:07
29 апр 21, 13:10    [22316302]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
fkthat
Member

Откуда:
Сообщений: 4880
jenya7
а что в этом страшеого?

Да вот именно, что страше огого
29 апр 21, 13:49    [22316340]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
jenya7,
как мне все это развидеть.
1 зоопарк, змеи и верблюды, интересная у вас корпаративная политика наименования переменных.
2 где же тут фабрика?
3 сделать одно поле статическим && все поля статическими это не одно и тоже.
29 апр 21, 13:51    [22316343]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
ViPRos
Member

Откуда:
Сообщений: 9943
щас пойдет блабла
29 апр 21, 14:23    [22316371]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2515
>jenya7, сегодня, 10:13 [22316153]
>как это сделать? он должен быть статический? и тогда все объекты с которыми он работает должны быть статическими?
<
Следует учитывать, что статические методы могут обращаться только к статическим членам класса. Обращаться к нестатическим методам, полям, свойствам внутри статического метода мы не можем.
29 апр 21, 16:24    [22316453]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
jenya7
Member

Откуда:
Сообщений: 1381
ВМоисеев
>jenya7, сегодня, 10:13 [22316153]
>как это сделать? он должен быть статический? и тогда все объекты с которыми он работает должны быть статическими?
<
Следует учитывать, что статические методы могут обращаться только к статическим членам класса. Обращаться к нестатическим методам, полям, свойствам внутри статического метода мы не можем.


антистатики утверждают что всё статическое это зло.

Сообщение было отредактировано: 29 апр 21, 16:22
29 апр 21, 16:30    [22316455]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
ViPRos
Member

Откуда:
Сообщений: 9943
jenya7,

да они просто не видели все это, когда не было никаких объектов :)
29 апр 21, 16:32    [22316456]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4370
jenya7,
в дот нете можно и в ногу выстрелить по незнанию, зачем читать Рихтера
 class MyClass<T>
    {
        private static  string _name;
        public MyClass(string name)
        {
            _name = $"{name} - {typeof(T)}";
        }

        public void Print()
        {
            Console.WriteLine(_name);
        }
    }

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

Сообщение было отредактировано: 29 апр 21, 16:55
29 апр 21, 16:56    [22316474]     Ответить | Цитировать Сообщить модератору
 Re: Метод на уровне видимости класса.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
Мутабельный статик в классе - это уж точно если не выстрел в ногу, то грабли.
Вообще, как я сильно подозреваю, ТС хочет что-то типа синглтона, только не зная про синглтон, он изобретает всяких франкенштейнов.
30 апр 21, 07:09    [22316644]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить