2

我们有一个库,其中包含几个具有不同功能的程序集。我们在为客户开发的任何前端项目中都使用这个库。假设我想在库中执行特定的任务/方法,但该方法的实现必须在前端。

简而言之:库中的X类调用库中Y类的方法A,但是方法A需要在库外实现。如何?

4

2 回答 2

0

将 ClassY 定义为 Abstract 类,要求使用者为定义为 Abstract 的方法提供实现。在 ClassY 基础上定义的逻辑对所有派生类都是通用的,在 ClassY 基础上定义为“抽象”的方法将需要由每个派生类实现。请注意,我只是将它一起破解,所以我没有声称实际代码代表最佳实践!

抽象基类:

public abstract class AbstractLibraryClassY
{
    private static int _multiplier = 0;


    public abstract int MethodA(int SomeParam);

    // A simple example Property defined and implemented on the Abstract base class:
    public int Multiplier
    {
        get { return _multiplier; }
        set { _multiplier = value; }
    }


    private void someclassYImplementationStuff()
    {
        // Other implementation code . . .
    }
}

ClassY 的两种可能实现:

public class ConcreteClassYImplementationOne : AbstractLibraryClassY
{
    public override int MethodA(int SomeParam)
    {
        return SomeParam * this.Multiplier;
    }
}


public class ConcreteClassYImplementationTwo : AbstractLibraryClassY
{
    public override int MethodA(int SomeParam)
    {
        return SomeParam * this.Multiplier + 5;
    }
}

X 类,使用 ClassY 的实例:

public class LibraryClassX
{
    public int methodCallsClassYMethodA(AbstractLibraryClassY ImplementedClassY)
    {
        ImplementedClassY.Multiplier = 2;
        return ImplementedClassY.MethodA(100);
    }
}

一个简单的演示,它使用 X 类按顺序使用 ClassY 的每个实现:

public class Consumer1
{
    public void ConsumeClassX()
    {
        // Some hokey, arbitrary inputs:
        int MyInput = 200;
        int MyMultiplier = 2;

        // Consume Library Class Y using ConcreteClassYImplementationOne:
        AbstractLibraryClassY InstanceOf = new ConcreteClassYImplementationOne();
        InstanceOf.Multiplier = MyMultiplier;

        // Will output 400, per implementation defined in ConcreteClassYImplementationOne:
        Console.WriteLine("Output = " + InstanceOf.MethodA(MyInput).ToString());

        // Consume Library Class Y using ConcreteClassYImplementationTwo:
        InstanceOf = new ConcreteClassYImplementationTwo();
        InstanceOf.Multiplier = MyMultiplier;

        // Will output 405, per implementation defined in ConcreteClassYImplementationTwo:
        Console.WriteLine("Output = " + InstanceOf.MethodA(MyInput).ToString());

    }
}

希望有帮助。还要查看评论者的建议:依赖注入。我现在才开始研究(这可能就是我刚才描述的 - 不确定,必须研究!

于 2012-07-04T15:07:34.377 回答
0

您可以从您的库中公开一个委托,并让消费者将其设置为指向他们自己的实现。

例子:

public delegate void DoWorkDelegate(CustomWorkParameters p);

public DoWorkDelegate DoWorkCallback
{
  get
  {
    return _workCallback;
  }
  set 
  {
    _workCallback = value;
  }
}

稍后在您的库中,当您需要实际完成工作时:

private void DoWorkInternal() 
{
  //Some work here

  //Check if caller set the callback
  if(_workCallback != null) 
  {
     _workCallback(localWorkParameters);
  }  
  else 
  {
     //throw exception
  }
  //Some more work here
}

消费者应该有一个尊重委托签名的方法,并在初始化阶段将其传递给您的库。

于 2012-07-04T14:16:53.733 回答