在子類中,可以隱藏和覆蓋基類的方法。隱藏和覆蓋有所不同。隱藏是把基類方法遮蔽,覆蓋是在子類中把基類方法替換掉。隱藏用new的方法,覆蓋用override的方法。兩者的區別是:用new方法只是隱藏了基類方法,基類方法還存在,通過一定方式還可以調用。用override是替換掉了基類方法。下面以例子來說明。python中的重寫就很簡單了,就是在子類中重寫該方法就可以了。
public class Creature
{
public Creature()
{
Console.WriteLine("這是Creature類");
}
public Creature(string str)
{
Console.WriteLine($"先執行帶參數的Creature類,參數是{str}");
}
public void DoSomething() => Console.WriteLine("這是Creature類的DoSomething方法");
public virtual void VirtualDosomething() => Console.WriteLine("這是Creature類的VirtualDosomething方法");
public virtual void VirtualDosomething2() => Console.WriteLine("這是Creature類的VirtualDosomething2方法");
public virtual void VirtualDosomething3() => Console.WriteLine("這是Creature類的VirtualDosomething3方法");
}
public class Animal : Creature
{
public Animal() : this("馬")//注意:這裏是實際參數,不是對參數的定義。
{
Console.WriteLine("最後執行不帶參數的Animal類");
}
public Animal(string str) : base(str)
{
Console.WriteLine($"再執行帶參數的Animal類。參數是{str}");
}
new public void DoSomething() => Console.WriteLine("這是Animal類的DoSomething方法");//用new的方法隱藏基類方法
public override void VirtualDosomething()//用override覆蓋基類方法
{
Console.WriteLine("基類方法VirtualDosomething已經被覆蓋。");
}
new public void VirtualDosomething2() => Console.WriteLine("這是Creature類的VirtualDosomething2方法");//利用new 來覆蓋基類virtual方法
public override void VirtualDosomething3()//用override覆蓋基類方法
{
Console.WriteLine("重新調用基類方法VirtualDosomething。");
base.VirtualDosomething3();
}
}
class Program
{
static void Main(string[] args)
{
Animal ani = new Animal();
ani.DoSomething();//隱藏基類此方法
ani.VirtualDosomething();//覆蓋基類方法
ani.VirtualDosomething2();//隱藏基類virtual方法
ani.VirtualDosomething3();//重新調用基類方法。
Creature cr = ani;//父類引用子類
cr.DoSomething();//調用基類方法
cr.VirtualDosomething();//override後,調用的是Animail的VirtualDosomething()方法。基類方法被覆蓋。
cr.VirtualDosomething2();//new後,調用的依然是Creatrue的VirtualDosomething2()方法。基類方法沒有被覆蓋。
}
}
輸出是:
python中的子類對繼承類的重寫
class A:
def __init__(self):
print("This is CLASS A")
def methodOne(self):
print("Class A method.")
class B(A):
def __init__(self):
print("This is CLASS B")
def methodOne(self):
print("Class B method.")
b=B()
b.methodOne()