01.override
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMyATOzMGMlNmY3IDNwIjNzYzX1EjN0MTMyAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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!");
}
}