标签:程序 src 不能 pac ted 接口 protect vat 构造
继承的类型
两种不同的继承类型:实现继承和接口继承
实现继承:就是类继承
接口继承:一个类型继承了函数的签名,而没有实现代码
多重继承:一个类派生自多个类。C#不支持多重继承,但是允许多接口继承。
结构:结构不支持实现继承,支持接口继承。
虚方法
如果一个类的方法声明修饰符是virtual,则在任何派生类中都可以重写该方法。重写该方法的修饰符是override
C#和Java的不同是,C#如果不是显示的说明是虚方法,则就不是虚方法,而Java中所有的方法都是虚方法。
隐藏方法
如果基类和派生类都有一个相同签名的方法,且没有声明时Virtual和override则基类的方法就会被隐藏。
这时候需要给派生类的方法添加修饰符new。则默认不会隐藏基类的方法,可以转换成基类继续调用基类的方法。
抽象类和抽象方法
如果一个类定义为Abstract则该类不能实例化。必须有派生类实现它。
抽象方法在基类中不能调用,必须在派生类中实现它。
密封类和密封方法
密封类定义为sealed,则表明该类不可再被继承。
(一般定义为sealed的类是出于商业原因或者不想被第三方使用,定义为密封类会限制使用方式,所以要慎用。)
派生类的构造函数
1:定义据有派生类的类
using System; namespace DrivedClassCon { class Program { static void Main(string[] args) { DirviedClass d = new DirviedClass(); Console.ReadLine(); } } class MyBaseClass { public MyBaseClass() { Console.WriteLine("base class"); } } class DirviedClass:MyBaseClass { public DirviedClass() { Console.WriteLine("dirvied class"); } } }
运行结果是
可以看到先执行的是基类的构造函数,再执行派生类的构造函数
2:如果基类有多个构造方法,也是这个结果。如下
using System; namespace DrivedClassCon { class Program { static void Main(string[] args) { DirviedClass d = new DirviedClass(); Console.ReadLine(); } } class MyBaseClass { public MyBaseClass() { Console.WriteLine("base class"); } public MyBaseClass(string s) { Console.WriteLine("base class with parmeter {0}",s); } } class DirviedClass:MyBaseClass { public DirviedClass() { Console.WriteLine("dirvied class"); } } }
如果必须要初始化基类的带参数的构造函数,则需要在派生类中的构造函数后面添加:base("参数")
3:如果需要调用类自己的其他构造函数,则需要在构造函数后添加this关键字
修饰符
public:修饰所有类型和成员。效果是任何代码都可以访问
protected:修饰类型和内嵌类型的所有成员。效果是只有派生类可以访问该项
internal:修饰所有类型和成员。效果是只能在包含它的程序集中访问该项
private:类型和内嵌类型的所有成员。效果是只能在它所属的类型中访问该项
protected internal:类型和内嵌类型的所有成员。效果是只能在包含它的程序集和派生类的任何代码中访问该项。
注意不能把类型定义成protected,private和protected internal。因为这些修饰符对于包含在命名空间中的类型没有意义。这三个修饰符只能用于成员。
其他修饰符
new:函数成员
static:所有成员
virtual:函数成员
abstract:函数成员
override:函数成员
sealed:类,方法,属性
extern:仅静态方法
接口
不能实例化接口,只能包含成员的签名。
接口不能有构造函数,也不能有字段(可以有属性)
不允许定义运算符重载。
一个接口或者类可以继承多个接口。
标签:程序 src 不能 pac ted 接口 protect vat 构造
原文地址:https://www.cnblogs.com/yuanhaowen/p/9950016.html