建议99:重写时不应使用子类参数

重写时,如果使用了子类参数,可能会偏离设计者的预期目标。比如,存在一个如下继承体系:

    class Employee
{
} class Manager : Employee
{
}

现在,类型ManagerSalary中的SetSalary方法重写了Salary中的相同方法,重写的方法采用一个子类参数:

    class Salary
{
public void SetSalary(Employee e)
{
Console.WriteLine("职员被设置了薪水。");
}
} class ManagerSalary : Salary
{
public void SetSalary(Manager m)
{
Console.WriteLine("经理被设置了薪水。");
}
}

调用者的代码看起来如下:

        static void Main(string[] args)
{
ManagerSalary m = new ManagerSalary();
m.SetSalary(new Employee());
}

设计者的本意是要设置经理的薪水,可是实际调用的代码却是设置了员工的薪水。

输出为:

职员被设置了薪水。

所以,在重写时,使用子类参数有一定风险,应当避免这种设计。正确的方法应当仍旧使用Employee类型参数,这起码能让编译器提醒我们要使用new关键字。

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

最新文章

  1. [LeetCode] Largest BST Subtree 最大的二分搜索子树
  2. ASP.NET里的Session详细解释
  3. 使用RDCMan管理SharePoint虚拟机的重复要求验证的问题
  4. [整] Android Fragment 生命周期图
  5. 面试题_31_to_47_JVM 底层与GC(Garbage Collection)的面试问题
  6. HDU 5742 It's All In The Mind
  7. Elasticsearch集群搭建
  8. 【前端学习】【CSS选择器】
  9. SpringMVC日期参数自动绑定
  10. JSF学习四 标签
  11. debian7 安装配置
  12. N个元素的集合划分成互斥的两个子集的数目
  13. ExtJs006类别名、备用名
  14. Java 编程 订单、支付、退款、发货、退货等编号主动生成类
  15. SpringMvc(4-1)Spring MVC 中的 forward 和 redirect
  16. 集合框架之Collections静态工具类
  17. java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener异常解决
  18. IDEA开发环境配置
  19. ionic3 生成android 如何控制versionCode版本号
  20. ReactNative学习笔记(四)热更新和增量更新

热门文章

  1. Collection集合学习(一)———Set接口与具体实现
  2. HDU-3661-Assignments
  3. CocoStudio创建动画帧
  4. springmvc 使用ajx上传文件 不设置form enctype
  5. VMware虚拟机如何设置从U盘启动
  6. 超简单让ubuntu开启wifi热点(亲测16.04与14.04可用)
  7. redis rdb文件解析
  8. kali中的中国菜刀weevely
  9. Spring cloud Eureka高可用 - 配置
  10. c# typeof 与 Type.GetType 使用与效率对比