C# Foundation---keyword: abstract & virtual & new & override

  1 using  System;
  2 using  System.Collections.Generic;
  3 using  System.Text;
  4
  5 namespace  CSharpFoundationStudy
  6 {
  7    /**//*
  8     * abstract virtual new override 关键字
  9     * abstract 修饰符可以用于类、方法、属性、事件和索引器,表示其为抽象成员
 10     * abstract 不可以和 static 、virtual 一起使用
 11     * 声明为 abstract 成员可以不包括实现代码,但只要类中还有未实现的抽象成员(即抽象类),那么它的对象就不能被实例化,通常用于强制继承类必须实现某一成员
 12     * 
 13     * 如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖。
 14     * 如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏。
 15     * 如果子类实现了父类相同的方法(相同的方法名称及签名),而没有new,在编译时会报警,但编译仍然能够通过!
 16     * 调用父类方法:base.方法名()
 17     * abstract类是一个抽象类,不能被实例化
 18     */

 19
 20    抽象基类#region 抽象基类
 21    public abstract class BaseAbstract
 22    {
 23        public abstract string Attribute
 24        {
 25            set;
 26            get;
 27        }

 28
 29        public void GFunction(string value)
 30        {
 31            Console.WriteLine("General Function in Abstract Base Class:" + value);
 32        }

 33
 34        public virtual void VFunction(string value)
 35        {
 36            Console.WriteLine("Virtual Function in Abstract Base Class:" + value);
 37        }

 38
 39        public abstract void AFunction(string value);
 40
 41        public abstract event EventHandler Event;
 42
 43        public abstract char this[int index]
 44        {
 45            get;
 46        }

 47    }

 48    #endregion

 49
 50    继承类#region 继承类
 51    public class DerivedInstance : BaseAbstract
 52    {
 53        private string attribute;
 54
 55        public override string Attribute
 56        {
 57            get
 58            {
 59                return attribute;
 60            }

 61            set
 62            {
 63                attribute = value;
 64            }

 65        }

 66
 67        //Error: CSharpFoundationStudy.BaseAbstract.GFunction(string) 未被标记为virtual abstract 无法进行重写
 68        //public override void GFunction(string value){ }
 69
 70        //Warning: 隐藏了继承的成员 如果是有意隐藏,请使用关键字 new 
 71        //public void GFunction(string value) { }
 72
 73        public new void GFunction(string value)
 74        {
 75            base.GFunction(value);
 76            Console.WriteLine("General Function in Base Class is Hidden with keyword new:" + value);
 77        }

 78
 79        public override void VFunction(string value)
 80        {
 81            base.VFunction(value);
 82            Console.WriteLine("Virtual Function Override in Derived Class:" + value);
 83        }

 84
 85        public override void AFunction(string value)
 86        {
 87            Console.WriteLine("Abstract Function Override in Derived Class:" + value);
 88            attribute = value;
 89            //调用委托
 90            if (Event != null)
 91            {
 92                Event(thisnew EventArgs());
 93            }

 94        }

 95
 96        public override char this[int index]
 97        {
 98            /**//*
 99             * String类
100             * String.Chars 属性 
101             * 获取此实例中位于指定字符位置的字符
102             * public char this [int index] { get; }
103             */

104            get return attribute[index]; }
105        }

106
107        /**//*
108         * EventHandle is delegate 委托
109         * 委托是一个定义签名的类型,即方法的返回值类型和参数列表类型。
110         * 可以使用委托类型来声明一个变量,该变量可以引用与委托签名相同的所有方法。 
111         * 事件处理程序委托的标准签名定义一个没有返回值的方法
112         * 其第一个参数的类型为 Object,它引用引发事件的实例
113         * 第二个参数从 EventArgs 类型派生,它保存事件数据。如果事件不生成事件数据,则第二个参数只是 EventArgs 的一个实例。否则,第二个参数为从 EventArgs 派生的自定义类型,提供保存事件数据所需的全部字段或属性
114         */

115        public override event EventHandler Event;
116    }

117    #endregion

118
119    public class Test
120    {
121        public static void OnFunction(object sender, EventArgs e)
122        {
123            /**//*
124             * From: http://www.cnblogs.com/anytao/  [你必须知道的.NET] 第一回:恩怨情仇:is和as
125             * as VS is 类型安全
126             * 类型转换包括显示转换和隐式转换,在.NET中类型转换的基本规则如下:
127             *    任何类型都可以安全的转换为其基类类型,可以由隐式转换来完成;
128             *    任何类型转换为其派生类型时,必须进行显示转换,转换的规则是:(类型名)对象名;
129             *    使用GetType可以取得任何对象的精确类型;
130             *    基本类型可以使用Covert类实现类型转换;
131             *    除了string以外的其他类型都有Parse方法,用于将字符串类型转换为对应的基本类型;
132             *    值类型和引用类型的转换机制称为装箱(boxing)和拆箱(unboxing)。
133             * 
134             * is/as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制
135             * is的规则如下:
136             *    检查对象类型的兼容性,并返回结果,true或者false;
137             *    不会抛出异常;
138             *    如果对象为null,则返回值永远为false。
139             * 
140             * as的规则如下:
141             *    检查对象类型的兼容性,并返回结果,如果不兼容就返回null;
142             *    不会抛出异常;
143             *    如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。
144             */

145            DerivedInstance instance = sender as DerivedInstance;
146            if (instance != null)
147            {
148                for (int i = 0; i < instance.Attribute.Length; i++)
149                {
150                    Console.WriteLine(instance[i]);
151                }
  
152            }

153        }

154        public static void Main()
155        {
156            DerivedInstance instance = new DerivedInstance();
157            instance.Event += new EventHandler(OnFunction);
158            instance.GFunction("simply-zhao 2008/1/20");
159            instance.VFunction("simply-zhao 2008/1/20");
160            instance.AFunction("simply-zhao 2008/1/20");
161            Console.ReadLine();
162        }

163    }

164}

165

转载于:https://www.cnblogs.com/simply-zhao/archive/2008/01/20/1046289.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值