如何私下使用接口

jth*_*h41 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是界面

interface IAccountable
{
    double CalculateSelfCost();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Lua*_*aan 7

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

private double materialsCost;
protected double MaterialsCost
{
    get 
    { 
         materialsCost = (this as IAccountable).CalculateSelfCost();
         return materialsCost;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,显式接口方法实现与类的其他方法是分开的.如果没有对包含接口的显式强制转换,您根本无法调用它们.事实上,CalculateSelfCost从某种说法来看,你的班级中没有虚拟方法.

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

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