zoukankan      html  css  js  c++  java
  • C#中new的用法,及与override的区别

    C#中new的用法有三种:

    (1)new是运算符,用于创建对象和调用构造函数。如Class1=new Class1();也可以为值类型调用默认的构造函数如int a=new int();此时a=0.

    (2)new是修饰符,用于隐藏基类成员的继承成员。override不能隐藏积累成员的继承成员。如:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace A
    {
       
        class Program
        {
            abstract public class Test
            {            
                public virtual void Prinf() 
                {
                    Console.WriteLine("Abstract Printf...");
                }
            }
            public class Class1 : Test
            {
                
                public override void Prinf() 
                {
    
                    Console.WriteLine("Class One Override Printf...");
                }
                 
            }
    
            public class Class2 : Test
            {
                public new void Prinf()
                {
    
                    Console.WriteLine("Class Two New Printf...");
                }
            }
     
            
            static void Main(string[] args)
            {
    
                Class1 cls1 = new Class1();
                Class2 cls2 = new Class2();
                cls1.Prinf();
                cls2.Prinf();
                ((Test)cls1).Prinf();
                ((Test)cls2).Prinf();
    
                Console.ReadLine();       
    
            }
        }
    }

    运行结果表明:new修饰符隐藏了重写方法,通过将派生对象转为为基类对象,调用了基类的方法。而override则是完全重写了方法,即便是转为基类对象也调用的也是派生类的重写方法。

    即:new隐藏的基类方法,override重写基类方法。

    注释:以上程序来源:http://www.cnblogs.com/xingluoyuanye/archive/2012/03/08/2384892.html

    (3)new是约束。用在泛型中添加类型的约束。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace A
    {
        class Test<T>
           where T : new()//定义类型T的约束,表示T类型必须有不带参数的构造函数
        {
            public T GetItem()
            {
                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();       
    
            }
        }
    }

    注释:参考http://msdn.microsoft.com/zh-cn/library/sd2w2ew5.aspx

  • 相关阅读:
    菜单按钮及导航
    实现点击箭头切换图片页和相册滚动
    网页设计的基本原则
    网格系统
    表单系列2
    类与对象学习总结
    汉诺塔的最简的步骤思路
    3.31作业解答
    初学java 用if语句做几个小程序
    做三个java初期学习的练习Var1~3为头目标
  • 原文地址:https://www.cnblogs.com/wang7/p/2453865.html
Copyright © 2011-2022 走看看