override 与new 重写父类虚方法 (new与virtual共存)

1.抽象类方法和虚方法都可以重写,但是我们专业的说:我们把抽象方法“实现”了,我们把 虚方法 “重写”了

2.抽象类没有实例,所以抽象方法也不能被直接调用(没有方法体)并且可以实现,抽象类可以写虚方法并且可以重写

3.虚方法可以再非抽象类与 抽象类内存在,虚方法在非抽象类里存在并且可以被实例调用

4.override 与重载是2个概念,重写与重载 在字面上就不同

5.override 在派生类重写父类方法的时候,凡是调用这个方法,我不管是直接调用这个方法,还是通过方法调用方法,他都是调用的重写的方法。

6.new 注意:条件 当派生类与父类的方法名 一样的时候存在,不然会报错(你用new 一个父类不存在的方法,那是无意义的)

7.new 用了,new是新的意思,只要生成了一个独立于父类的方法,把父类的方法隐藏了,这个方法必然是与父类的方法同名,那么派生类的这个方法与父类的这个方法,虽然字面上一样,但是他们没有半点关系,是相互独立的。但是可以调用父类的方法。

 

class Test
{
static void Main()
{
Father father = new Father();
father.Speaking1();//The Father Method
father.Speaking2();//The Father Method

Child child = new Child();
child.Speaking1();//The Child Method
child.Speaking2();//The Child Method
}
}
class Father
{
public virtual void Speaking1()
{
Console.WriteLine("The Father Method ");
}

public virtual void Speaking2()
{
Speaking1();
}
}

class Child:Father
{
public override void Speaking1()
{
Console.WriteLine("The Child Method");
}
}
 

override的情况:

1.当重写饿了speaking1,不管是怎么调用这个方法,是直接调用,还是通过方法再调用,都是调用的重写的方法

new的情况:

 Father father = new Father();
father.Speaking1();//The Father Method
father.Speaking2();//The Father Method

Child child = new Child();
child.Speaking1();//The Child Method
child.Speaking2();//The Father Method 不同了

new之后,speaking1 方法独立了,通过speaking2方法调用的时候,它是调用了Father的方法。


 


注:如果使用了new,但是这个方法父类没有,那么会提示“不会隐藏继承的成员,不需要使用new”


new:虽然new隐藏了父类的方法,但是可以调用父类的方法

class Test
    {
        static void Main()
{
       

            Child child = new Child();
            child.Speaking1();// The Father Method  The Child Method
            child.Speaking2();//The Father Method
        }
    }
    class Father
    {
        public virtual void Speaking1()
        {
            Console.WriteLine("The Father Method ");
        }

        public virtual void Speaking2()
        {
            Speaking1();
        }
    }

    class Child:Father
    {
        public new void Speaking1()
        {
            base.Speaking1();
            Console.WriteLine("The Child Method");
        }
    }

关于new与virtual共同存在:

 class Test
{
static void Main()
{

Third third = new Third();
third.Speaking2();//The Father Method
third.Speaking1();//The Third Method


}
}
class Father
{
public virtual void Speaking1()
{
Console.WriteLine("The Father Method ");
}

public virtual void Speaking2()
{
Speaking1();
}
}

class Child:Father
{
public new virtual void Speaking1()
{
base.Speaking1();
Console.WriteLine("The Child Method");
}
}

class Third : Child
{
public override void Speaking1()
{
Console.WriteLine("The Third Method");
}
}

分析:

 

1.因为Third类重写的是Child类的speaking1方法(继承于child的方法而不是Father的方法):(与Child类似,与基类的speaking1是独立的方法)

注:基类的virtual无法扩展到new的方法上。(因为他们是独立的)

third.Speaking2();调用基类的speaking2方法里的speaking1是基类的方法


 

posted on 2011-12-28 09:24  SplendidMe  阅读(519)  评论(0编辑  收藏  举报