4

考虑以下示例:

namespace Test
{
    interface IContract : IContract<object> { }

    interface IContract<T>
    {
        void Definition(T data);
    }

    public class SomeClass : IContract, IContract<SomeContractClass>
    {
        public void Definition(SomeContractClass data)
        {
            // ...
        }
    }

    public class SomeContractClass { }
}

我想我会通过提供满足接口,Definition(SomeContractClass data)因为如MDSN中所述:

在 C# 的统一类型系统中,所有类型,预定义的和用户定义的,引用类型和值类型,都直接或间接地继承自 Object。

但是编译器要求我明确定义它:

错误 1 ​​'Test.SomeClass' 没有实现接口成员 'Test.IContract.Definition(object)'

4

2 回答 2

8

您正在实现接口IContract

如果我们展平继承层次结构,我们可以看到它IContract基本上看起来像这样:

interface IContract
{
    void Definition(object data);
}

您不提供与签名匹配的void Definition (object data)方法 - 您提供的方法SomeContractClass取而代之。因此,您会收到所述的错误消息。

但是,我认为根本问题是您的类同时实现了IContractand IContract<T>(这与说IContract<object>and相同IContract<T>)。我认为你的设计需要一些工作......

于 2013-02-26T14:12:06.437 回答
3

我将对你的情况做一个小类比。

你有一家修理小型汽车的小公司。

您与需要维修外交车队中任何类型车辆(飞机、船只、大卡车和小型汽车)的政府签订合同。

在你做出概括的那一刻,你撒谎/犯了一个小错误

1)既然你成功实施

void Repair(SmallCar vehicle) 

2) 因为

class SmallCar : Vehicle { }
class Airplane : Vehicle { }
class Boat : Vehicle { }
class BigTruck : Vehicle { }

不知何故,点 (1 + 2) => 点 3 的组合表明:

3)政府可以放心地将您的小公司称为“修理任何东西的人”,并且有一天会认为要求您的公司像这样帮助他们是个好主意:

Airplane protocolPlane = new Airplane();
yourCompany.Repair(protocolPlane);

这当然不是真的:(1 + 2)并不意味着(3)

这最终成为编译器错误而不是运行时异常,这是一件好事。通过这种方式,您可以更快地了解架构中的一个小问题。

编辑

在您的代码中,如果您决定确实需要在SomeClass类中实现这两个接口并且您不知道如何执行此操作,则可以使用显式接口实现,如下所示:

public class SomeClass : IContract, IContract<SomeContractClass>
{
    // Method of IContract<SomeContractClass>
    public void Definition(SomeContractClass data)
    {
        Console.WriteLine("Processing a SomeContractClass instance");            
        // ...etc
    }
    // Method of IContract hence of IContract<object>
    void IContract<object>.Definition(object data)
    {
        if (data is SomeContractClass)
          this.Definition(data as SomeContractClass);
        else
        {
          string descriptor = (null == data) 
            ? "A null reference" 
            : "An instance of " + data.GetType().Name";
          Console.WriteLine("Processing something other than a SomeContractClass instance: " + descriptor);
          // ...etc
        }
    }

}

这样,您将成功获得以下结果:

class Program {
     public static void Main(string[] args) {
         SomeClass someInstance = new SomeClass();
         IContract<SomeContractClass> first= someInstance;
         IContract second = someInstance;

         someInstance.Definition(new SomeContractClass()); 
         // prints out "Processing a SomeContractClass instance"

         first.Definition(new SomeContractClass());
         // prints out "Processing a SomeContractClass instance"

         second.Definition(new SomeContractClass());
         // prints out "Processing a SomeContractClass instance"

         second.Definition( "something else" );
         // prints "Processing something other 
         // than a SomeContractClass instance: An instance of String"

         second.Definition( 123 );
         // prints "Processing something other
         // than a SomeContractClass instance: An instance of Int32"

         first.Definition( true );
         // doesn't compile saying that bool can't be converted to SomeContractClass

     }
}

编辑结束

于 2013-02-26T14:19:03.603 回答