C#继承
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一、继承的类型 class MyDerivedClass:MyBaseClass C#不支持私有继承,所以基类名上没有public或private限定符。{ //function and data members here } 类派生于接口,则用都好分隔。 2.1 虚方法 在C#中可以把在方法或者属性的前面加上virtual,声明基类的方法为虚方法或者虚属性,虚方法和虚属性的规则相同。语法如下: class MyBaseClass 在C#中,方法在默认的情况下不是虚拟的,但(除构造函数以外)可以显示的声明。派生类重写基类的虚方法时,要使用override关键字显示声明:{ public virtual string VirtualMethod() { return "this method is virtual and define in MyBaseClass"; } } 注意:成员字段和静态函数不能被声明为virtual,因为这个概念只对类中的实例函数成员有意义。 2.2 隐藏方法 如果在基类和派生类中都声明了签名相同的方法,而基类中的方法又没有声明为virtual,派生类中的方法也没有声明成override,则派生类方法就会隐藏基类方法。结果是调用哪个类的方法取决于引用实例的变量类型,而不是实例本身的类型。 2.3 调用函数的基本版本 C#有一种特殊的语法用于从派生类中调用方法的基本版本:base.<MethodName>()。 2.4 抽象类和抽象函数 C#中的抽象类要声明为abstract,抽象类不能实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。显然抽象函数也是虚拟的,但不需要提供virtual关键字,而用abstract关键字。如果类包含了抽象函数,那么该类也是抽象的,类必须用abstract声明。 absttact class Building 2.5 密封类和密封方法{ public abstract decimal CalculateHeatingCost();//abstract method } C#允许把类和方法声明为sealed,对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。 sealed class FinalClass 2.6 派生类的构造函数{ } 在创建派生类的实例时,实际上会有多个构造函数在起作用。实例化类的构造函数本身不能初始化类,还必须调用基类中的构造函数。即派生类的实例构造是按层次结构进行的,顺序是先执行基类的构造函数,再执行派生类的构造函数。 基类的构造函数总是最先调用,那么派生类的构造函数可以在执行的过程中调用基类的方法、属性和其他成员,因为基类已经构造出来了,其他字段也初始化了。 //在结构层次中添加无参数的构造函数 三、修饰符public abstract class GenericCustomer { private string name; public GenericCustomer():base() { name = "myName"; } } //在结构层次中添加带参数的构造函数 public class Nevermore60Customer:GenericCustomer { private int highCost; public Nevermore60Customer(string name):base(name) { this.highCost = 0; } } C#中完整的修饰符列表:
四、接口 接口中只能包含方法、属性、索引器和事件的声明。接口不能实例化,不能有构造函数或字段,也不包含运算符重载。接口定义中还不允许声明成员的修饰符,成员接口总是public的,不能声明成virtual或者static 4.1 接口的定义和实现 //定义 4.2 派生的接口namespace InterfaceTest { public interface IBankAccount { void PayIn(decimal amount); bool Withdraw(decimal amount); decimal Balance { get; } } } //实现 namespace InterfaceTest { public class SaverAccount:IBankAccount { private decimal balance; public void PayIn(decimal amount) { balance += amount; } public bool Withdraw(decimal amount) { if(balance >= amount) { balance -= amount; return true; } Console.WriteLine("Withdrawal attempt failed."); return false; } public decimal Balance { get { return balance; } } public override string ToString() { return String.Format("Venus Bank Saver:Balance = {0,6:C}",balance); } } } 接口可以继承,其方式与类的继承相同。 该文章在 2017/2/7 18:52:32 编辑过 |
关键字查询
相关文章
正在查询... |