学习日志-virtual,override,new,overload
学一点记一点,免得忘记..
Father
代码
class Father
{
/// <summary>
/// 虚方法可以被派生重写
/// 其实就是父亲告诉儿子,这项技能你可以学,但是学了就需要有自己的“创新(override or new)”
/// </summary>
public virtual void virtualMethod()
{
Console.WriteLine("Father Virtual Method");
}
/// <summary>
/// 如果在派生类中有同名方法,可以拿new关键字,隐藏父类方法,当然new也可以用于实例化类
/// 其实可以理解为儿子学会了和父亲“类似”的技能,比如父亲唱通俗哥,儿子唱流行歌
/// </summary>
public void newMethod()
{
Console.WriteLine("Father New Method");
}
/// <summary>
/// 派生类不能继承
/// 其实可以理解为父亲不希望儿子学会的,比如父亲抢劫,不希望儿子学会...
/// </summary>
private void privateMethod()
{
Console.WriteLine("Father Private Method");
}
/// <summary>
/// 派生类可以继承
/// 其实可以理解为父亲遗传给儿子的技能
/// </summary>
public void publicMethod()
{
Console.WriteLine("Father Public Method");
}
/// <summary>
/// publicMethod的重载
/// 重载:同名不同参
/// 也是父亲遗传给儿子的技能
/// </summary>
public void publicMethod(string message)
{
Console.WriteLine("Father Public Method" + message);
}
}
{
/// <summary>
/// 虚方法可以被派生重写
/// 其实就是父亲告诉儿子,这项技能你可以学,但是学了就需要有自己的“创新(override or new)”
/// </summary>
public virtual void virtualMethod()
{
Console.WriteLine("Father Virtual Method");
}
/// <summary>
/// 如果在派生类中有同名方法,可以拿new关键字,隐藏父类方法,当然new也可以用于实例化类
/// 其实可以理解为儿子学会了和父亲“类似”的技能,比如父亲唱通俗哥,儿子唱流行歌
/// </summary>
public void newMethod()
{
Console.WriteLine("Father New Method");
}
/// <summary>
/// 派生类不能继承
/// 其实可以理解为父亲不希望儿子学会的,比如父亲抢劫,不希望儿子学会...
/// </summary>
private void privateMethod()
{
Console.WriteLine("Father Private Method");
}
/// <summary>
/// 派生类可以继承
/// 其实可以理解为父亲遗传给儿子的技能
/// </summary>
public void publicMethod()
{
Console.WriteLine("Father Public Method");
}
/// <summary>
/// publicMethod的重载
/// 重载:同名不同参
/// 也是父亲遗传给儿子的技能
/// </summary>
public void publicMethod(string message)
{
Console.WriteLine("Father Public Method" + message);
}
}
Son
代码
class Son : Father
{
/// <summary>
/// 重写基类的虚方法
/// 其实可以理解为儿子学会了父亲的技能,并且有了自主知识产权
/// </summary>
public override void virtualMethod()
{
Console.WriteLine("Son Virtual Method");
}
/// <summary>
/// 隐藏父类的重名方法
/// 其实可以理解为儿子学会了父亲的技能,并且有了自主知识产权
/// </summary>
public new void newMethod()
{
Console.WriteLine("Son New Method");
}
}
{
/// <summary>
/// 重写基类的虚方法
/// 其实可以理解为儿子学会了父亲的技能,并且有了自主知识产权
/// </summary>
public override void virtualMethod()
{
Console.WriteLine("Son Virtual Method");
}
/// <summary>
/// 隐藏父类的重名方法
/// 其实可以理解为儿子学会了父亲的技能,并且有了自主知识产权
/// </summary>
public new void newMethod()
{
Console.WriteLine("Son New Method");
}
}
Main
代码
class Program
{
static void Main(string[] args)
{
Son son = new Son();
son.virtualMethod();
son.newMethod();
son.publicMethod();
Console.WriteLine();
Father father = new Father();
father.virtualMethod();
father.newMethod();
father.publicMethod();
Console.WriteLine();
Father father_son = new Son();
father_son.virtualMethod();//override完全重写的基类的方法
father_son.newMethod();//new仅仅是隐藏了,当出现上转型对象时,还是调用父亲的方法
father_son.publicMethod();
}
}
{
static void Main(string[] args)
{
Son son = new Son();
son.virtualMethod();
son.newMethod();
son.publicMethod();
Console.WriteLine();
Father father = new Father();
father.virtualMethod();
father.newMethod();
father.publicMethod();
Console.WriteLine();
Father father_son = new Son();
father_son.virtualMethod();//override完全重写的基类的方法
father_son.newMethod();//new仅仅是隐藏了,当出现上转型对象时,还是调用父亲的方法
father_son.publicMethod();
}
}
输出
Son Virtual Method
Son New Method
Father Public Method
Father Virtual Method
Father New Method
Father Public Method
Son Virtual Method
Father New Method
Father Public Method