01.override
class Program
{
static void Main(string[] args)
{
Controller controller=new SubClass();
ReadKey();
}
}
class Controller
{
public Controller()
{
Run();
}
public void Start()
{
Console.WriteLine("Start");
}
private void Run()
{
Start();
InternalRun();
Stop();
}
public void Stop()
{
Console.WriteLine("Stop");
}
protected virtual void InternalRun()
{
Console.WriteLine("ControllerInternalRun");
}
}
class SubClass:Controller
{
protected override void InternalRun()
{
Console.WriteLine("SubClassInternalRun");
}
}
02.new 加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数
new和overrid的区别
01.当子类构造父类时,调用的是父类的构造方法
class Program
{
static void Main(string[] args)
{
A a =new B(); //A只认识类B中继承于类A的Method函数,也就是它本身的方法,对于B类中的Method它不可见
a.Method(); //this Method in Class A! 调用了类B中继承于A的Method函数
ReadKey();
}
}
public class A
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public new void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
02.override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数
使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)
//B的Method函数完全覆盖基类的同名虚函数Method,使整个继承链中看见的Method函数都是B中的Method,所以就算是以A角度来看B,A看到的Method函数也是 //B中的Method,因为A中的Method完全被B的覆盖了
class Program
{
static void Main(string[] args)
{
A a =new B();
a.Method(); //this Method in Class B! 调用了类B的Method函数
ReadKey();
}
}
public class A
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public override void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
03.如果要在B的对象中调用A的Method函数还是有办法,就是使用base关键字
class Program
{
static void Main(string[] args)
{
A a =new B();
a.Method(); ///this Method in Class B this Method in Class B! 调用了类A和B的Method函数
ReadKey();
}
}
public class A
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public override void Method()
{
base.Method();
Console.WriteLine("This Method in Class B!");
}
}
04.sealed
public class A
{
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public sealed override void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
public class C : B
{
}
05.构造器
class Program
{
static void Main(string[] args)
{
A a =new B();
a.Method();
ReadKey();
}
}
public class A
{
//首先访问的是基类A的构造器
public A()
{
Console.WriteLine("A");
}
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public override void Method()
{
Console.WriteLine("This Method in Class B!");
}
}
当基类没有可以访问的构造器时候
在派生类中要显式指定基类的构造器
class Program
{
static void Main(string[] args)
{
A a =new B(2);
a.Method();
ReadKey();
}
}
public class A
{
private int a;
public A(int a)
{
this.a = a;
}
public virtual void Method()
{
Console.WriteLine("This Method in Class A!");
}
}
public class B : A
{
public B(int a) : base(a)
{
}
public override void Method()
{
Console.WriteLine("This Method in Class B!");
}
}