Можно ли в таком случае расширить функцию из библиотеки? - PullRequest
0 голосов
/ 29 августа 2010

У меня есть библиотека .Net. скажем с 2 публичными функциями. скажем, один Summmator, который принимает 2 аргумента и A+B. Другая функция simpleMultiplicator, которая принимает 2 аргумента: число для умножения и количество раз, которое оно должно быть умножено. Функция simpleMultiplicator при вызове использует функцию Summmator. Так что это моя библиотека. Он скомпилирован в dll для .net4. В моей программе я хочу расширить или изменить функцию Summator, чтобы при вызове simpleMultiplicator она использовала мою модификацию исходной функции Summator. Возможно ли это в .net4, как это сделать?

(C #, visual-C ++)

Ответы [ 2 ]

1 голос
/ 29 августа 2010

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

Вот пример использования наследования:

namespace MyLibrary
{
    public class MyMath
    {
        // Be aware of the virtual keyword which enables overriding the method
        public virtual int Summmator(int a, int b)
        {
            return a + b;
        }

        public int SimpleMultiplicator(int a, int b)
        {
            int result = 0;
            for (int i = 0; i < b; i++)
            {
                result = Summmator(result, a);
            }
        }
    }
}

namespace MyProgram
{
    using MyLibrary;

    public class MyExtendedMath : MyMath
    {
        public override int Summmator(int a, int b)
        {
            return a + 2 * b;
        }
    }

    public static class Program
    {
        public static void Main()
        {
            MyMath math = new MyExtendedMath();
            int result = math.SimpleMultiplicator(2, 3);

            Console.WriteLine(result);
        }
    }
}

Другой способ - использовать полиморфизм:

namespace MyLibrary
{
    public interface ISummmator
    {
        int Summmator(int a, int b);
    }

    public class Summmator : ISummator
    {
        public int Summmator(int a, int b)
        {
            return a + b;
        }
    }

    public static class MyMath
    {
        public static int SimpleMultiplicator(int a, int b, ISummmator summmator)
        {
            int result = 0;
            for (int i = 0; i < b; i++)
            {
                result = summmator.Summmator(result, a);
            }
        }
    }
}

namespace MyProgram
{
    using MyLibrary;

    public class MySummmator : ISummmator
    {
        public int Summmator(int a, int b)
        {
            return a + 2 * b;
        }
    }

    public static class Program
    {
        public static void Main()
        {
            int result = MyMath.SimpleMultiplicator(2, 3, new MySummmator());

            Console.WriteLine(result);
        }
    }
}

С наилучшими пожеланиями, Оливер Ханаппи

1 голос
/ 29 августа 2010

Во-первых, я бы объективировал эти вещи.Таким образом, у вас есть Summator, который предоставляет функцию суммы, и SimpleMultiplicator, который предоставляет функцию умножения.Затем вы добавляете Summator в SimpleMultiplicator в случае по умолчанию.Например,

class SimpleMultiplicator
{
    public SimpleMultiplicator()
    {
      this.summator = new Summator();
    }

    public int Mult(int a, int b)
    {
      // ...
      this.summator.sum(something, somethingelse);
      // etc
    }

Затем вы создаете другой конструктор, в котором вы можете переопределить сумматор по умолчанию:

  public SimpleMultiplicator(Summator summator)
  {
    this.summator = summator;
  }

Поэтому, если вы хотите изменить функцию суммирования, вы создаете новыйоснованный класс, переопределите его метод sum () и передайте его конструктору SimpleMultiplicator.

...