none
Как создать вот такой вот класс RRS feed

  • Вопрос

  • Задача:

    1. Описать класс FuncCollection, который может предоставлять список базовых методов (функций)
    2. Должен уметь к своему списку методов, уметь добавлять дополнительные методы(типа так: описываешь новый класс, со стандартным методом Calculate(), создаешь объект класса, и передаешь это объект некоторому методу AddFunc() класса FuncCollection)
    3. класс должен хранить результаты вычислений для аргументов от 0 до N требуемых функций.(например, если я хотя бы раз запросил данные ч/з метод MyFunc1(), то эта функция просчитывается, результаты записываются в массив и при след. вызове, уже не просчитываются а выдают готовый результат)
    4. класс должен работать без инициализации объекта. (например методы класса Math можно же использовать сразу)

    если с пунктами 1-3 все просто, то совершенно не понимаю как можно реализовать именно 4-й пункт.
    в приложении результаты одних и тех же вычислений, могут использоваться в разных контролах приложения, а т.к. вычисления достаточно трудоемкие, то постоянно их вычислять, совершенно не рентабельно. Поэтому сейчас, я в приложении созздаю объект данного класса, заношу его в Tag основной формы приложения.

    и далее в контролах использую..(ParentForm.Tag)

    но есть еще классы не контролы, в которых нет прямого  способа получить Tag приложения и в такие классы приходится егопередавать, что совсем не удобно. объявить как public объект класса вне приложения у меня не получилось.
    к тому же планируется ее использование не только в приложении, но и в других dll

    поэтому прошу помощи как можно решить задачу?

    14 марта 2012 г. 5:40

Ответы

  • > класс должен работать без инициализации объекта. (например методы класса Math можно же использовать сразу) [...] совершенно не понимаю как можно реализовать именно 4-й пункт.
     
      
    см. Static Members

     

    • Помечено в качестве ответа anknown123455 15 марта 2012 г. 3:23
    14 марта 2012 г. 5:51

Все ответы

  • > класс должен работать без инициализации объекта. (например методы класса Math можно же использовать сразу) [...] совершенно не понимаю как можно реализовать именно 4-й пункт.
     
      
    см. Static Members

     

    • Помечено в качестве ответа anknown123455 15 марта 2012 г. 3:23
    14 марта 2012 г. 5:51
  • > результаты одних и тех же вычислений, могут использоваться в разных контролах приложения, а т.к. вычисления достаточно трудоемкие, то постоянно их вычислять, совершенно не рентабельно
     
     
    см. Lazy<T>; примерно так:

    class Test
    {
        public int Value
        {
            get { return _Value.Value; }
        }
        Lazy<int> _Value;
    
        public Test()
        {
            _Value = new Lazy<int>(Compute, true);
        }
    
        int Compute()
        {
            var ret = 0;
            //
            // сложные вычисления ret;
            //
            return ret;
        }
    }


       

    14 марта 2012 г. 6:08
  • Спасибо, попробую!
    14 марта 2012 г. 6:37
  • > есть еще классы не контролы, в которых нет прямого  способа получить Tag приложения и в такие классы приходится егопередавать, что совсем не удобно
     
     
    в такой ситуации можно использовать System.ComponentModel.Composition
    например есть сборка some.dll
     
    [c:\temp\addin\some.dll]

    using System;
    using System.ComponentModel.Composition;
    namespace Test
    {
        class Some
        {
            [Export("v1")]
            string Value
            {
                get { return DateTime.Now.ToString(); }
            }
        }
    }
     

    значение Some.Value можно получить в своем приложении так:

    var v1 = this.Get<string>("v1");

    для этого надо к проекту добавить сборку System.ComponentModel.Composition.dll
    и в форме должен быть следующий код:

    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            readonly CompositionContainer _Container;
            T Get<T>(string name = null)
            {
                return _Container.GetExportedValueOrDefault<T>(name);
            }
    
            public Form1()
            {
                _Container = new CompositionContainer(
                    new DirectoryCatalog(@"c:\temp\addin\", "*.dll"));
                _Container.ComposeParts(this);
    
                var v1 = this.Get<string>("v1");
            }
        }
    }
     
       
    • Изменено Malobukv 14 марта 2012 г. 9:27
    14 марта 2012 г. 9:25
  • Только еще в этом случае должен быть либо один объект класса на всю программу, либо поля и методы должны быть статическими (см ответ Malobukv выше), чтобы к ним можно было обращаться как к методам класса Math.

    Не забудьте отметить ответы, которые решат вашу проблему (кнопка Пометить как ответ).

    Спасибо.


    Для связи [mail]

    14 марта 2012 г. 10:21
  • Всем еще раз спасибо, получилось все сделать ч/з статический класс.

    15 марта 2012 г. 3:24