如何私下使用接口

时间:2014-02-17 14:38:23

标签: c# interface

我试图在几个不同的类中私下使用一个接口。但是我不会让我在下面看到的getter中调用函数:

public abstract class PreFabComponent : IAccountable
{

    //This represents the cumulative cost of all members, connectors, and supporting hardware
    private double materialsCost;
    protected double MaterialsCost
    {
        get 
        { 
             materialsCost = CalculateSelfCost();
             return materialsCost;
        }
    }




    //  Returns the sum of all Cumulative costs
    double IAccountable.CalculateSelfCost()
    {
        double sum = 0;

        foreach (IAccountable item in accountableItemsContatined)
        {
           sum += item.CalculateSelfCost();
        }

        return sum;
    }
}

这是界面

interface IAccountable
{
    double CalculateSelfCost();
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

你需要做一个明确的演员:

private double materialsCost;
protected double MaterialsCost
{
    get 
    { 
         materialsCost = (this as IAccountable).CalculateSelfCost();
         return materialsCost;
    }
}

基本上,显式接口方法实现与类的其他方法是分开的。如果没有显式强制转换为包含接口,您只需无法调用它们。事实上,在你的课堂上,没有虚拟方法CalculateSelfCost,以某种方式说话。

如果你想了解更多相关信息,这是一个好的开始 - http://msdn.microsoft.com/en-us/magazine/cc163791.aspx(专门针对MethodTable部分)。您可以看到正在实现的接口的方法表与您的类的方法表是分开的。在隐式接口方法实现的情况下,main方法表和接口方法表都包含引用,而在显式实现中,main方法表根本没有引用。现在,这样的细节通常对最终程序员来说根本不重要,但我希望这能满足你的好奇心:)

这也有一些与内部或封装实践无关的实际原因,例如,如果您有两个具有相同签名但在两个不同接口上的方法的显式实现,您实际上会调用哪一个?您不必试图解决歧义,而是必须始终正确地调用方法,并包含显式接口。