zoukankan      html  css  js  c++  java
  • c# 优化代码的一些规则——什么情况下应该使用new[七]

    前言

    new 在重构这本书中写道new就是坏代码的味道,说明使用new的情况并不多。

    在这里我指的new 是方法修饰符,而不是指实例。

    正文

    看下new的作用:

    new 修饰符可以重新定义从基类继承下来的非虚成员。

    也就是说你考虑的是是不是需要重新定义,如果不需要那么就不应该使用new。

    使用一个new 产生的一个问题:

    MakeObject:

    public class MakeObject: MyOtherClass
    {
    }
    

    MyOtherClass:

    public class MyOtherClass:MyClass
    {
    	public new void MagicMethod()
    	{
    		Console.WriteLine(nameof(MyOtherClass));
    	}
    }
    

    MyClass:

    public class MyClass
    {
    	public void MagicMethod()
    	{
    		Console.WriteLine(nameof(MyClass));
    	}
    }
    

    那么看一下:

    static void Main(string[] args)
    {
    	MakeObject make = new MakeObject();
    	MyClass c1=make as MyClass;
    	c1.MagicMethod();
    	MyOtherClass c2=make as MyOtherClass;
    	c2.MagicMethod();
    	Console.ReadKey();
    }
    

    运行结果为:

    MyClass
    MyOtherClass
    

    其实我们也能猜到结果就是这个,那么有什么问题呢?

    我们使用同一个对象C上面调用同一个方法居然结果不一致,这取决于类型转换为MyClass 或者MyOtherClass 。

    这样一看好像没什么问题,但是却不是。

    因为如果你想让其子类重写,你可以设置为virtual,也就是虚方法。

    这个new 其实就是让我们来兼容一些东西的。

    比如说MyClass 原本没有MagicMethod 方法,但是后来加了这个MagicMethod 。

    然后这时候myclass 的地方又非常多的地方使用,这时候就会报错,当然现在会自动加上new了。

    这只是给我们一个缓存区,最好的方式还是去修改子类的方法名,因为最后可能我们还是要调用到MyClass 的MagicMethod 方法,这时候新的问题又产生了。

  • 相关阅读:
    浅谈异或相关性质
    重谈树状数组
    洛谷 U141397 !
    谈谈Sleep和wait的区别
    请描述线程的生命周期
    一个普通main方法的执行,是单线程模式还是多线程模式?为什么?
    创建线程的方式
    一道关于try catch finally返回值的问题
    throw跟throws的区别
    罗列常见的5个非运行时异常
  • 原文地址:https://www.cnblogs.com/aoximin/p/13024308.html
Copyright © 2011-2022 走看看