我将对你的情况做一个小类比。
你有一家修理小型汽车的小公司。
您与需要维修外交车队中任何类型车辆(飞机、船只、大卡车和小型汽车)的政府签订合同。
在你做出概括的那一刻,你撒谎/犯了一个小错误
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
}
}
编辑结束