访问修饰符:public、protected、private、internal
用于指定声明的成员或类型的可访问性。
public:不受限
protected:仅限于包含类或包含类派生的子类
internal:当前程序集
protected internal:internal 或 protected ,两者求并集
private:当前包含类型abstract
指示被修改内容的实现已丢失或不完整。
可用于修饰类、方法、属性、索引和事件。- 抽象类
抽象类不能实例化
包含0个或1个以上抽象方法和访问器(属性) ,抽象类中不一定有抽象方法或抽象访问权(属性)
不能用sealed修饰,sealed和abstract具有相反的含义。sealed类不能被继承,abstract类要求被继承 - 抽象方法和抽象属性
指示方法或属性不包含实现
抽象方法是隐式的虚方法
只有抽象类中才有抽象方法声明
通过override在派生类中重写替代抽象方法或属性
抽象类必须为所有实现的接口提供实现,可将接口映射到抽象方法上,例如:
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
- 抽象类
sealed
断子绝孙符
修饰类时,类不可以被继承
修饰方法/属性时,子类不能替代此方法或属性virtual
用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写
虚成员的实现可由派生类中的替代成员更改
虚方法就是有默认实现的抽象方法
在修饰方法时override和new的区别:
override只能重写virtual、abstract、override修饰的方法
new是隐藏,可通过类型转换调用到基类的方法。
override是重写,无论是派生类还是基类都会找到派生类方法。
new可以隐藏基类中的普通方法,也可以隐藏基类中的虚方法。
new可以修改方法可访问性,而override不可以。
public class A
{
public void method1()
{
Console.WriteLine("this is A method1");
}
public virtual void method2()
{
Console.WriteLine("this is A method2");
}
public void method3()
{
Console.WriteLine("this is A method3");
}
public virtual void method4()
{
Console.WriteLine("this is A method4");
}
}
public class B : A
{
public void method1()
{
Console.WriteLine("this is B method1");
}
public override void method2()
{
Console.WriteLine("this is B method2");
}
public new void method3()
{
Console.WriteLine("this is B method3");
}
//private virtual 错误
//private virtual void method4()
//{
// Console.WriteLine("this is A method4");
//}
//private override 错误
//private override void method4()
//{
// Console.WriteLine("this is A method4");
//}
//private new 正确
private new void method4()
{
Console.WriteLine("this is A method4");
}
}
public static void main()
{
A a1 = new A();
A a2 = new B();
B a3 = new B();
Console.WriteLine("A A*******************");
a1.method1();
a1.method2();
a1.method3();
Console.WriteLine("A B*******************");
a2.method1();
a2.method2();
a2.method3();
Console.WriteLine("B B*******************");
a3.method1();
a3.method2();
a3.method3();
Console.WriteLine("(A) A B*******************");
((A)a2).method1();
((A)a2).method2();
((A)a2).method3();
Console.WriteLine("(A) B B*******************");
((A)a3).method1();
((A)a3).method2();
((A)a3).method3();
}
输出结果:
A A*******************
this is A method1
this is A method2
this is A method3
A B*******************
this is A method1
this is B method2
this is A method3
B B*******************
this is B method1
this is B method2
this is B method3
(A) A B*******************
this is A method1
this is B method2
this is A method3
(A) B B*******************
this is A method1
this is B method2
this is A method3
abstract、virtual、override、new
abstract和virtual都是用于修饰基类方法
virtual有默认实现,abstract无实现
abstract方法一定是在抽象类中出现,virtual不一定
override用于重写abstract、virtual和override修饰的方法
new用于隐藏基类中的普通方法或override修饰的方法
new可修改方法的可访问性,override不可以
new隐藏的方法可通过对象类型转换进行调用,override对象类型转换后调用的还是派生类的方法