Вопрос для знатоков C#

Rocketmedia

Client
Регистрация
12.03.2012
Сообщения
112
Благодарностей
13
Баллы
18
Друзья, уже неделю бьемся над решением вроде бы простой задачи. Перерыли все пособия, обращались к некоторым спецам с форума, но решения так и не нашли.


Нужен специальный вызов класса и действий в кубике Zennoposter.


На скриншоте (http://www.evernote.com/l/AfoNFuckBJRLWaYE0Iq32fIKcxCgsXJ6cHc) при наборе "an" появляются стандартные действия (GetType, ToString и т.д.), но нужно, чтобы появлялось действие "Inner".
Также, чтобы после выбора "Inner", можно было выбрать "InnerInner" и псоле него выбрать функцию "ACTION_two".
Вместе с этим, должны быть входные параметры (an.title, и т.д.), которые задаются после создания объекта класса.
Если другими словами объяснить, то нужно, чтобы в кубике Zennoposter можно было выбирать дочерние классы основного класса.
an -> Inner -> InnerInner -> ...

*/

Outher an = new Outher();
an.title = "Заголовок";
an.Inner.InnerInner.ACTION_two();


/*
Примерная структура класса в usings Zennoposter

*/

public class Outher {

public string title;

public class Inner {

public void ACTION_first() {
Outher.title = "first";
doit();
}

public class InnerInner {
public void ACTION_two() {
Outher.title = "two";
doit();
}
}
}

public void doit() {

}
}
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Это делается довольно просто. Достаточно создать класс Inner и создать объект этого класса в классе Outher. Аналогичное провернуть для классов Inner и InnerInner. А в самом конце создать паблик метод ACTION_two.
 
  • Спасибо
Реакции: szechwalkeyka1978

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
а к каким спецам Вы обращались? либо люди были заняты, либо плохо просили
а зачем Вам надо именно так? в чём преимущество??
 

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
Это делается довольно просто. Достаточно создать класс Inner и создать объект этого класса в классе Outher. Аналогичное провернуть для классов Inner и InnerInner. А в самом конце создать паблик метод ACTION_two.
Внимательней топик читайте.
 

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
а к каким спецам Вы обращались? либо люди были заняты, либо плохо просили
Уже ко многим обращались. Может они достаточно заняты были, что не смогли помочь.
а зачем Вам надо именно так? в чём преимущество??
Чтобы в owncode была грамотная структура классов для наших задач и в каждом кубике c# писать только вызов функций с переменными. В этом случае, при обновлении классов не нужно каждый кубик переписывать (так у нас раньше было), а достаточно лишь в owncode внести изменения.
 
  • Спасибо
Реакции: szechwalkeyka1978

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
Это делается довольно просто. Достаточно создать класс Inner и создать объект этого класса в классе Outher. Аналогичное провернуть для классов Inner и InnerInner. А в самом конце создать паблик метод ACTION_two.
Вот посмотрите, какой в топике был класс. Как вы написали, такой сейчас есть. Или не так вас понял?

PHP:
public class Outher {
   
   public string title;
   
   public class Inner {
     
      public void ACTION_first() {
         Outher.title = "first";
         doit();
      }     
     
      public class InnerInner {
         public void ACTION_two() {
            Outher.title = "two";
            doit();
         }   
      }
   }
   
   public void doit() {
     
   }
}
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Уже ко многим обращались. Может они достаточно заняты были, что не смогли помочь.

Чтобы в owncode была грамотная структура классов для наших задач и в каждом кубике c# писать только вызов функций с переменными. В этом случае, при обновлении классов не нужно каждый кубик переписывать (так у нас раньше было), а достаточно лишь в owncode внести изменения.
создавайте статический класс и используйте его методы - чем такое решение не подходит
 

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
создавайте статический класс и используйте его методы - чем такое решение не подходит
Это была самая первая версия класса. В этом случае многопоток не работает.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
  • Спасибо
Реакции: Ananaset Hurik

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
Никогда не доводилось этим пользоваться, да и сомневался, что многопоточность зенки относится к Interlocked. Если так получится и на скорости работы это не отразится, то послужит отличным решением.

А больше решений не видно, кроме Interlocked? Чтобы не в статическом классе получить всплывающие подсказки для выбора класса - подкласса - функции подкласса?
Вот на скрине не появляются "ACTION_first", "InnerInner -> ACTION_two".

На PHP это решалось бы через конструктор, а в C# как только не извращался, не выходит без статического класса.
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Никогда не доводилось этим пользоваться, да и сомневался, что многопоточность зенки относится к Interlocked. Если так получится и на скорости работы это не отразится, то послужит отличным решением.

А больше решений не видно, кроме Interlocked? Чтобы не в статическом классе получить всплывающие подсказки для выбора класса - подкласса - функции подкласса?
Вот на скрине не появляются "ACTION_first", "InnerInner -> ACTION_two".

На PHP это решалось бы через конструктор, а в C# как только не извращался, не выходит без статического класса.
если вы хотите работать с вложенными классами, то это не статические классы и надо создавать объекты, чтобы появлялись подсказки - Outher.Inner an2 = new Outher.Inner (); чтобы иметь доступ из внешнего класса к внутреннему Вам надо в конструкторе вмещающего класса создать объект вложенного класса, как выше код привёл, и тогда будет подсказка an.an2

П.С. - примерно так, если ничего не напутал
 
  • Спасибо
Реакции: Ananaset Hurik

Ananaset Hurik

Новичок
Регистрация
11.02.2017
Сообщения
11
Благодарностей
1
Баллы
3
если вы хотите работать с вложенными классами, то это не статические классы и надо создавать объекты, чтобы появлялись подсказки - Outher.Inner an2 = new Outher.Inner (); чтобы иметь доступ из внешнего класса к внутреннему Вам надо в конструкторе вмещающего класса создать объект вложенного класса, как выше код привёл, и тогда будет подсказка an.an2

П.С. - примерно так, если ничего не напутал
Не уверен, что правильно вас понял, может поправите. Вот добавил объект вложенного класса, но возникла ошибка, связанная с переменными.

PHP:
 public class Outher
{

   public string title;
   private string title2;
   private int zerr;
   public IZennoPosterProjectModel project;
   public Instance instance;
   
   public Inner an2 = new Inner();

   public class Inner
   {
      public void ACTION_first()
      {
         //Outher.title2 = "first";
         //Outher.doit();
      }

      public class InnerInner
      {
         public void ACTION_two()
         {
            //Outher.title2 = "two";
            //Outher.doit();
         }
      }
   }
   
   

   public void doit()
   {
      Outher.zerr = 0;
      Outher.project.SendInfoToLog("Старт | " + Outher.title + " | " + zerr.ToString(),true);
      System.Threading.Thread.Sleep(2000);
      zerr = zerr + 1;
      Outher.project.SendInfoToLog("Выполнили" + Outher.title + " | " + zerr.ToString(),true);
      Outher.project.Variables["login"].Value = Outher.project.Variables["login"].Value + "1";
   }
}

Либо, может свяжемся в скайпе и за оплату сможете помочь?
 

LaGir

Client
Регистрация
01.10.2015
Сообщения
211
Благодарностей
852
Баллы
93
del
 
Последнее редактирование:

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
в конструкторе надо создавать объект, а в теле класса просто переменную объекта объявляете - public Outher.Inner an2;
конструктор это в теле оутер класса вы пишите - public Outher() {this.an2 = new Outher.Inner ();} - конструктор - вызывается при создании объекта аутер - автоматически
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
если не разберётесь - пишите в скайп - vipvodu , за денежку конечно помогу)
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
если не разберётесь - пишите в скайп - vipvodu , за денежку конечно помогу)
За что тут денюжку брать, пусть лучше потратят ее на нормальную книжку по С#

Друзья, уже неделю бьемся над решением вроде бы простой задачи. Перерыли все пособия, обращались к некоторым спецам с форума, но решения так и не нашли.
Общий код:
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }

    public class Outher
    {
        public string Title { get; set; }
        public Inner Inner { get; private set; }

        public Outher ()
        {
            Inner = new Inner(this);
        }

        public void doit()
        {

        }
    }

    public class Inner
    {
        private Outher _outher;

        public InnerInner InnerInner { get; private set; }

        public Inner(Outher outher)
        {
            _outher = outher;
            InnerInner = new InnerInner(outher);
        }

        public void ACTION_first()
        {
            _outher.Title = "first";
            _outher.doit();
        }


    }
    public class InnerInner
    {
        private Outher _outher;
        public InnerInner(Outher outher)
        {
            _outher = outher;
        }

        public void ACTION_two()
        {
            _outher.Title = "two";
            _outher.doit();
        }
    }
}
Кубик:
OuterInner.png

P.S. Чтобы код править в одном месте только, лучше вынести его в отдельную длл, иначе замахаетесь потом переоткрывать кучу проектов, чтобы в них обновился commoncode

P.P.S. Еще можно использовать [ThreadStatic] или ThreadLocal и дальше работать со статикой, но там есть свои ньюансы.
C#:
public static class Outher
    {
        [ThreadStatic]
        public static string title;

        public static class Inner
        {

            public static void ACTION_first()
            {
                title = "first";
                doit();
            }

            public static class InnerInner
            {
                public static void ACTION_two()
                {
                    title = "two";
                    doit();
                }
            }
        }

        public static void doit()
        {

        }
    }
 
Последнее редактирование:
  • Спасибо
Реакции: Rocketmedia

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
За что тут денюжку брать, пусть лучше потратят ее на нормальную книжку по С#
меня с детства учили, что от денег - не разумно отказываться))

ТС, кстати про доступ из дочернего к родителю ничего вроде как не писал, может запутается
 
Последнее редактирование:

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
  • Спасибо
Реакции: stanar

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113
Отказываться и просить это, имхо, немного разные вещи )
так я и не просил)) посмотри время моих сообщений - сначала написал как сделать, потом увидел, что выше в конце последнего сообщения ТС мне деньги предлагает - и добавил ещё сообщение о том что не откажусь
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
ТС, кстати про доступ из дочернего к родителю ничего вроде как не писал, может запутается
У него там в коде же ясно видно что он хочет из дочерних менять title родителя.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Отказываться и просить это, имхо, немного разные вещи )
они сами предлагали забашлять. К тому же просто кодом без пояснений дело явно не ограничится. Как никак целая команда задачу решала)
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
так я и не просил)) посмотри время моих сообщений - сначала написал как сделать, потом увидел, что выше в конце последнего сообщения ТС мне деньги предлагает - и добавил ещё сообщение о том что не откажусь
Ага увидел, сорь, я прост по привычке смотрю первое и последнее сообщеие, всю простыню читать лень обычно :-)
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
они сами предлагали забашлять. К тому же просто кодом без пояснений дело явно не ограничится. Как никак целая команда задачу решала)
Пояснять это придется начинать с основ ООП, так что пусть лучше книжку купят.
 
  • Спасибо
Реакции: Rocketmedia

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 955
Благодарностей
781
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)