none
interface实现方式的问题 RRS feed

  • 问题

  • interface实现方式的问题public class a :IQuoteProduct
    {
    #region IQuoteProduct Members

    public decimal[] CountPrice()
    {
    throw new Exception("The method or operation is not implemented.");
    }

    #endregion
    }

    public class a :IQuoteProduct
    {
    #region IQuoteProduct Members

    decimal[] IQuoteProduct.CountPrice()
    {
    throw new Exception("The method or operation is not implemented.");
    }

    #endregion
    }

    在类工a中,两种实显接口的方式,有什么区别,分别如何应用,有什么好处.

    希望能说个例子说明一下.
    2007年8月3日 2:31

答案

  • 使用显示接口的用途主要集中在两个方面:

    1. 如果一个类继承多个接口,而多个接口定义了相同的函数声明,此时就必须使用显示接口来区分类中实现函数具体针对的接口。

    2. 为了实现类型检测。这种实现方式主要是由于接口中函数的参数大部分情况时Object类型,如果使用隐式接口,如果传递的参数类型与函数体中需要cast 到的类型不匹配,那么不会报出编译时错误而是运行时错误,所以我们通过显示接口的方法来实现一种技巧使得产生报出编译时错误。以下举个例子:

    public interface IComparable {
    Int32 CompareTo(Object other);
    }

    使用implicit interface:

    class SomeValueType : IComparable {
    private Int32 x;
    public SomeValueType(Int32 x) { this.x = x; }
    public Int32 CompareTo(Object other) {
    return(x - ((SomeValueType) other).x);
    }
    }

    static void Main() {
    SomeValueType v = new SomeValueType(0);
    Object o = new Object();
    Int32 n = v.CompareTo(o);
    }

    此时由于不会报编译错误,但其实由于o不存在x field,运行时会出错误。根据出现编译错误优于运行时错误。我们可以这样修改代码:

    class SomeValueType : IComparable {
    private Int32 x;
    public SomeValueType(Int32 x) { this.x = x; }
    public Int32 CompareTo(SomeValueType other) {
    return(x - other.x);
    }
    // NOTE: No public/private used on the next line
    Int32 IComparable.CompareTo(Object other) {
    return CompareTo((SomeValueType) other);
    }
    }

    SomeValueType v1 = new SomeValueType(1);
    SomeValueType v2 = new SomeValueType(2);
    Int32 n;
    n = v1.CompareTo(new Object()); // Compile-time error
    n = v1.CompareTo(v2); // Calls CompareTo

    在其他情况下,还是建议使用implict interface。
    2007年8月3日 2:52