c#中接口实现的问题

时间:2014-12-30 22:55:12

标签: c# interface

我的代码中有以下界面

public interface IDevTestable
{
    bool RunTest(out List<Result> selfTestResults);
}

我有4个不同的类实现接口:

class A: IDevTestable
{
    public bool RunTest(out List<Result> selfTestResults)
    {
     //get value1 
    }
}

class B: IDevTestable
{
    public bool RunTest(out List<Result> selfTestResults)
    {
      //get value2
    }
}

class C: IDevTestable
{
    public bool RunTest(out List<Result> selfTestResults)
    {
       //get value3 
    }
}

class D: IDevTestable
{
    public bool RunTest(out List<Result> selfTestResults)
    {
      //get value4 
    }
}

当我遍历我的代码中的所有程序集,并找到实现该接口以尝试调用 RunTest 方法的程序集时,无论如何它始终运行第一个实现。

如何从代码中选择我想在给定时间运行的特定实现?

这就是我运行代码以获取接口的所有实现的方式:

//dev is the driver name that has the implementation. I checked that I got all the driver names correctly. 
foreach (object dev in Devices)
{
    IDevTestable obj = dev as IDevTestable;

    if (obj != null)
    {
       retVal = obj.RunTest(out indvTestResults);
    }
}

每次只运行A类的实现。有什么建议我可能会丢失,或者可能添加以使它运行我希望它运行的特定实现?

1 个答案:

答案 0 :(得分:3)

  

如何从代码中选择我想在给定时间运行的特定实现?

当你问这个时,你是指如何进行对象动态绑定?您不需要显式调用在其中一个类中实现的方法。只需要创建该类型的对象,其余的就由它自己完成。

你没有说清单是如何填充的,但是我想像这样填充它

Devices.Add(new A());
Devices.Add(new B());
Devices.Add(new C());
Devices.Add(new D());

此外,如果您确定每个设备都实现了您的接口IDevTestable,那么您最好将列表定义为

List<IDevTestable>

而不是

List<object>

只是为了确保列表中没有放置外来类型对象..

IDevTestable obj = dev as IDevTestable;
如果dev不是实现IDevTestable的类的实例,则

obj将为null。