在这种情况下是否可以从库中扩展函数?

时间:2010-08-29 13:43:04

标签: c# .net visual-c++ .net-4.0

我有一个.Net库。说有2个公共职能。假设一个是Summmator,它接受​​2个参数并且A+B。另一个函数simpleMultiplicator,它带有两个参数:一个乘数的数字和它应该被乘的次数。调用simpleMultiplicator函数时使用Summmator函数。所以这是我的图书馆。它被编译成.net4的dll。在我的程序中,我想扩展或修改Summator函数,这样当我调用simpleMultiplicator时,它将使用我对原始Summator函数的修改。在.net4中是否可以,怎么做?

(C#,visual-C ++)

2 个答案:

答案 0 :(得分:1)

首先,我将这些东西客观化。所以你有一个提供和函数的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
    }

然后你创建另一个构造函数,你可以覆盖默认的Summator:

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

因此,如果要更改求和函数,可以创建一个新的基于Summator的类,覆盖其sum()方法并将其传递给SimpleMultiplicator构造函数。

答案 1 :(得分:1)

这取决于你如何设计你的课程。您声明您的库导出了两个公共函数,但它们需要在类上定义为静态或实例方法,因此您可以使用面向对象的原则(如继承或多态)来实现您想要的。

以下是使用继承的示例:

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);
        }
    }
}

最诚挚的问候, Oliver Hanappi