C#学习笔记(二)隐藏和覆盖(重写)

本文介绍了C#中隐藏和覆盖的概念。隐藏发生在派生类中同名成员变量或方法遮蔽父类相应成员时;而覆盖(重写)涉及虚方法,使用`override`关键字改进父类的实现。隐藏在静态编译时确定,覆盖在运行时根据对象实际类型确定,体现了多态性。关键点包括:方法签名需一致,只能覆盖虚方法,保持相同访问性等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、隐藏

如果基类和派生类声明了两个具有相同签名的方法,编译时会显示一个警告。

方法签名由方法名、参数数量和参数类型共同决定,方法的返回类型不计入签名。

派生类方法会隐藏(或屏蔽)基类中具有相同签名的方法。

                                                                               ——《Visual C#2013从入门到精通》

简单地说:派生类可以隐藏父类的成员,如果在派生类中声明了与父类同名的新成员时,父类的该成员就不能在派生类中被访问到。

1.在派生类中声明的成员变量与父类同名,则父类成员在派生类中被隐藏了
class Animal
{
    public int age=24;
    int sex;
}

class Cat : Animal
{
    public int age = 12;
}
class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        Console.WriteLine("cat's age is {0}", cat.age);
        Animal animal = new Animal();
        Console.WriteLine("animal's age is {0}", animal.age);
    }
}

运行结果:

cat's age is 12

animal's age is 24

2.在成员函数声明中,子类可以包含一个new修饰符来表示与父类的同名方法的区别
class Animal
{
    public int age=24;

    public void showAge()
    {
        Console.WriteLine("animal's age is {0}",age);
    }
}

class Cat : Animal
{
    new public int age = 12;

    new public void showAge()
    {
        Console.WriteLine("cat's age is {0}", age);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.showAge();
        Animal animal = new Animal();
        animal.showAge();
        Animal animal1 = new Cat();
        animal1.showAge();
    }
}

运行结果:
cat's age is 12
animal's age is 24
animal's age is 24

隐藏的时候可以使用new显示说明,在编程的过程中,没有写new的时候也是可以编译通过的,不过可能会有警告。

二、覆盖(重写)

虚方法: 如果希望父类某个方法的实现能够在子类中进一步得到改进,那么将父类的该方法定义为虚方法使用virtual关键字定义虚方法

覆盖: 如果希望改进父类的某个虚方法,使用override关键字覆盖父类的方法,提供自己的实现就可以了。当覆盖虚方法时,覆盖的方法必须与被覆盖的方法具有相同的方法签名。子类的override方法在名称、参数类型、参数名称、参数顺序、返回值类型都必须与基类中的虚方法完全一样。

class Animal
{
    public int age=24;

    public virtual void showAge()
    {
        Console.WriteLine("animal's age is {0}",age);
    }
}
class Cat : Animal
{
    new public int age = 12;

    public override void showAge()
    {
        Console.WriteLine("cat's age is {0}", age);
    }
}
class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        cat.showAge();
        Animal animal = new Animal();
        animal.showAge();
        Animal animal1 = new Cat();
        animal1.showAge();
    }
}

运行结果:
cat's age is 12
animal's age is 24
cat's age is 12

隐藏PK覆盖

隐藏在静态编译的确定执行对象。

覆盖在动态编译时确定执行对象。

观察代码中黄色标明的部分,在隐藏时,声明的对象是Aniaml类型,就决定了调用的函数是Animal这个父类中的函数。而在覆盖的时候,虽然声明的对象是Animal,但是在动态编译的过程中发现实际执行的是Cat对象,就会调用Cat中的方法。体现了继承的多态性。

需要注意的几点:

1.虚方法和覆盖(重写)方法的签名必须是一致的。

2.只能重写虚方法,其他方法不能被重写。

3.如果派生类不用override关键字声明方法,就不是覆盖(重写)基类方法,而是隐藏基类方法。

4.两个方法必须具有相同的可访问性。

5.重写方法隐式地成为虚方法,可在派生类中重写。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值