zoukankan      html  css  js  c++  java
  • NEW关键字的三种用法

      最近面试中有一道题是写new关键字的几种用法,想了下写下我知道的两种用法

      第一种 创建对象、调用构造函数,这就不用讲了 ClassA  A=new ClassA();

      第二种 是作为修饰符,显示隐藏继承于基类的继承成员 

      class Program
        {
            static void Main(string[] args)
            {
                Class1 cls1 = new Class1();
                Class2 cls2 = new Class2();
                cls1.Prinf();
                cls2.Prinf();
                Test t1 = new Class1();
                Test t2 = new Class2();
                t1.Prinf();
                t2.Prinf();
                Console.ReadLine();
            }
    
            abstract public class Test
            {
                public virtual void Prinf()
                {
                    Console.WriteLine("base Printf...");
                }
            }
            public class Class1 : Test
            {
                public override void Prinf()
                {
                    Console.WriteLine("Class1  Printf...");
                }
            }
    
            public class Class2 : Test
            {
                public new void Prinf()
                {
                    Console.WriteLine("Class2  Printf...");
                }
            }
        }

    我们可以看到 打印的最后一条信息 子类继承于父类的方法被隐藏,实现了父类的方法,override 则完全重写了方法,即使转变为基类对象调用的也是派生类的重写方法。

      第三种 是用在泛型中添加类型的约束

      

     class Test<T>
        where T : new()//定义类型T的约束,表示T类型必须有不带参数的构造函数
        {
            public T GetItem()
            {
                // return T();
                return new T();//如果不添加new()约束,编译错误:变量类型“T”没有 new() 约束,因此无法创建该类型的实例
                //想一下,T类型不知道,编译器不知道分配多大的空间,所以会通过反射技术实现
            }
        }
        class TClass
        {
            private int a;
    
            public TClass()  //如果不添加无参构造函数,编译错误:TClass必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“A.Test<T>”中的参数“T”
            {
    
            }
            public TClass(int a)
            {
                this.a = a;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Test<TClass> test = new Test<TClass>();
                Console.ReadLine();
               
            }
    }
  • 相关阅读:
    Git学习手记(一)
    微信开发手记(二)
    mysql命令行打开中文乱码
    在linux上centos6安装pdo_mysql扩展
    在linux上安装php5.6版本提示GD2版本要高于2.1.0解决
    在linux上安装apache是出现error1错误
    在linux上搭建amp环境安装jpeg时出现libtool command not found,error127解决
    在linux中搭建amp环境(apache2.4.7+mysql5.5.23+php5.6.19)
    mysql忘记root密码解决办法
    移动端网页设计经验与心得
  • 原文地址:https://www.cnblogs.com/a164266729/p/5278826.html
Copyright © 2011-2022 走看看