日期:2014-05-18  浏览次数:22027 次

令人困惑的 throw new NotImplementedException();
//代理类
  public class HelloWCFClient : ClientBase<IHelloWCFService>, IHelloWCFService
  {
  public HelloWCFClient(System.ServiceModel.Channels.Binding binding, EndpointAddress remoteAddress)
  : base(binding, remoteAddress)
  { 
  }

  public string HellowWCF(string str)
  {
  return base.Channel.HelloWCF(str);
  //return str;
  }

  public string HelloWCF(string str)
  {
  throw new NotImplementedException();
  }
  }



以上代码为什么必须实现
public string HelloWCF(string str)
  {
  throw new NotImplementedException();
  }
才能正常,去掉就报错错误
“HandClientByClientBase.HelloWCFClient”不实现接口成员“HandClientByClientBase.IHelloWCFService.HelloWCF(string)”

王那位大虾指点下。

------解决方案--------------------
为什么Visual Studio要添加throw new NotImplementedException();而不是直接留空呢。

原因我想有2:
一个是对于那些有返回值的方法,如果什么都不写,会无法通过编译,VS不希望这样;
另一个原因是,NotImplementedException();可以表示真的没有实现这个方法。对于可以预见的调用者,它们可能真的只需要使用接口中的一些方法。因此完全没有必要实现所有的方法。NotImplementedException();保证了不实现某些方法,代码仍然合法,同时对调用的违例给出异常提示。
------解决方案--------------------
一个很经典的例子是,比如有一个叫鸟的接口,我们定义了下蛋、吃、飞行三个方法。

当我们实现一个鸵鸟的类的时候,如果非要在飞行中添加点代码,或者胡乱返回点什么,如2楼说的那样,并不是好的设计,因为这会让人产生迷惑。

因此直接在方法体内填入throw new NotImplementedException();是一个合理的设计。

类似地,我们设计一个方法,获得来自传感器的温度,用正数表示零上温度,用负数表示零下温度。一个不好的设计是,当传感器故障没有返回的时候返回0,或者某个值。这会导致调用者的迷惑,到底这是故障还是确实有这么一个温度呢。因此最好表示为异常。

去年的动车事故中,信号机没有正确获得信号,因为雷击导致供电中断了。信号机软件在无法获得信号的时候,会返回之前的信号,而不是报错,最终导致了事故。这说明对软件异常的处理必须非常谨慎。
------解决方案--------------------
C# code

public string HellowWCF(string str)
public string HelloWCF(string str)