C#中继承实现父类方法、重写、重载

本文详细介绍了C#中的继承概念,包括子类如何通过重写(override)和重载(overload)来实现父类的方法。文章通过具体实例展示了virtual、override和new等关键字的使用方式。

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

 C#中子类重写父类方法的几种情况,关键字:virtual、abstract、override、new。(此处不说abstract,以后补充)

  virtual:不是必须被子类重写的方法,父类必须给出实现,子类可以重写(使用override,new,或无特殊标志的普通方法),也可以不重写该方法。

  new:重写父类方法时,父类可以使用virtual,override,new之一声明,也可以是没有关键字的普通方法,运行时会根据引用类型选择调用父类还是子类方法,重写父类方法时,使用new关键字与使用没有关键字的普通方法的等效的,但是后者会给出编译警告。


继承:

  继承是派生类(子类)去实现(重写<override>、重构<new>)基类(父类)的方法或属性。从而获取在派生类中要实现的功能。

   子类调用父类构造方法,在父类中有个实现姓名和年龄的构造方法但是子类中也要实现这样的功能时,子类不用再次去写这个功能,只要去调用父类的功能即可。

#region 
    public class Person
    {
        private string _name ;
        private int _age ;
        public Person(string name, int age)//父类的构造方法 
        {
            this._name = name;//获得参数的值 
            this._age = age;
            Console.WriteLine("您的姓名是{0},您的年龄是{1}.",this._name, this._age);
        }

    }
    public class Studnet : Person
    {
        private int _id;
        public Studnet(string name, int age, int IDCard):base(name, age)//子类构造方法继承父类构造方 
                                                                 //把接受到的name、age两个参数交给父类的构造方法去处理 
        {
            this._id = IDCard;
            Console.WriteLine("您的身份证号码为{0}", this._id);
        }
    }


    class Program
    {
        static void Main(string[] args)//主函数 
        {
            Studnet stu = new Studnet("小王", 18, 340406);
            Console.ReadLine();
        }
    } 
    #endregion 
  实现结果:

  您的姓名是 小王,您的年龄是 18. 
  您的身份证号码为 340406
 

  子类调用父类方法时,先执行父类的方法,再去执行子类的方法。


重写:

  重写只是对方法里面的功能重新做了编写,并没有对方法的参数进行添加,改变,删除。重写是面向对象的概念

  举例:重写Show方法

     public class Person 
     {
        public virtual void Show(string name, string school, string Class) 
         { 
             Console.WriteLine("我在{0}学习",Class); 
             Console.WriteLine("我叫{0}.我毕业与{1}",name,school); 
         } 
     } 

     public class Studnet : Person 
     {
         public override void Show(string name, string school, string Class) //重写了父类的ShowME方法 
         { 
             Console.WriteLine("姓名{0},毕业学校{1},曾读班级{2}",name,school,Class); 
         } 
     } 


    class Program 
     { 
         static void Main(string[] args)//主函数 
         {
             Studnet stu = new Studnet(); 
             stu.Show("小王","家里蹲大学","泡妹(1)班"); 
             Console.ReadLine(); 
         } 
     } 
    #endregion 
  实现结果:

  姓名小王,毕业学校家里蹲大学曾读班级lol最强王者班        (没有运行父类中方法)

  重写的父类方法时,必须指明被重写的方法是虚方法(virtual关键字)。在子类重写父类方法时必须有重写关键字(override)这样才能重写父类的方法


重载:

  重载除了方法名不能被改变为另外什么都能重新定义(方法作用域、返回类型、方法体、方法参数) (当然也可以只改变部分内容比如只改变方法体,不改变参数)重载是面向过程的概念

  重载Show方法

  测试1:

#region 重载Show方法
    public class Person
    {
        public void Show()
        {            
            Console.WriteLine("我是父类的方法");
        }
    }

    public class Studnet : Person
    {        
        public new void Show( )//此处不写new会出现编译提示,但是不算出错。
        {
            Console.WriteLine("我是子类的方法");
        }
    }

    class Program
    {
        static void Main(string[] args)//主函数 
        {
            Studnet stu = new Studnet();
            stu.Show();
            Console.ReadLine();
        }
    } 
    #endregion 
  实现结果:

  我是子类方法       (没有运行父类中方法)

  测试2:

#region 重载Show方法
    public class Person
    {
        public void Show(string name, string school, string Class)
        {
            Console.WriteLine("我在{0}学习", Class);
            Console.WriteLine("我叫{0}.我毕业与{1}", name, school);
        }        
    }

    public class Studnet : Person
    {
        public new void Show(string name)//这个子类重写父类方法,除了方法名没变其他都变了,再使用new会有编译提示,但不算出错,可以不写new了
        {
            Console.WriteLine("姓名{0}", name);
        }        
    }

    class Program
    {
        static void Main(string[] args)//主函数 
        {      
            Studnet stu = new Studnet();
            stu.Show("小王");
            Console.ReadLine();
        }
    } 
    #endregion 
  实现结果:

  姓名小王  

  子类重载父类方法,子类必须指定重载的关键字(new),而父类被重载的方法则可以不用关键字(virtual)。重载一个方法,是对一个方法重新进行了编写从方法的参数到方法体,唯独方法的名称没有进行改变。重载也可以对原来没有返回类型的方法(void),改变为有返回类型的方法。总体来讲,重载除了方法名不能被改变,另外什么都能重新定义(方法作用域、返回类型、方法体、方法参数) 

### 什么是方法重写(Override)? 方法重写是指在派生类中重新定义基类中声明为 `virtual`、`abstract` 或 `override` 的方法。通过重写,可以在子类中提供与父类不同的实现逻辑,同时保持方法签名一致[^4]。这样做的主要目的是实现多态性,即运行时根据对象的实际类型来决定调用哪个方法。 #### 示例:方法重写 ```csharp class Base { public virtual void Print() { Console.WriteLine("Print in Base"); } } class Derived : Base { public override void Print() { Console.WriteLine("Print in Derived"); } } ``` 在这个例子中,`Base` 类中的 `Print` 方法被标记为 `virtual`,表示它可以被子类重写;而 `Derived` 类使用 `override` 关键字提供了自己的实现[^3]。 --- ### 什么是方法重载(Overload)? 方法重载是指在同一类中定义多个同名的方法,但这些方法的参数列表(参数的数量、类型或顺序)必须不同。返回值类型不能作为区分重载方法的依据。重载通常用于增强代码的可读性和灵活性,使开发者可以根据不同的输入调用相同名称的方法。 #### 示例:方法重载 ```csharp class MathOperations { public int Add(int a, int b) { return a + b; } public double Add(double a, double b) { return a + b; } public string Add(string a, string b) { return a + b; } } ``` 上述代码中,`Add` 方法被多次定义,分别处理整数、浮点数和字符串类型的加法操作。编译器会根据传入参数的类型自动选择合适的方法[^5]。 --- ### 方法重写重载的主要区别 | 特性 | 方法重写(Override) | 方法重载(Overload) | |------|----------------------|----------------------| | 所属类 | 发生在父子类之间 | 发生在同一个类内 | | 方法签名 | 必须完全相同 | 参数必须不同(数量、类型或顺序) | | 关键字 | 使用 `virtual` 和 `override` | 不需要特殊关键字 | | 多态支持 | 支持运行时多态 | 不涉及多态机制 | | 访问权限 | 重写方法访问级别必须一致 | 可以有不同的访问修饰符 | --- ### 使用场景对比 - **方法重写**适用于希望子类改变从父类继承方法行为的情况。例如,在图形绘制系统中,`Shape` 类可能有 `Draw()` 方法,而 `Circle` 和 `Rectangle` 子类可以分别重写方法实现各自形状的绘制逻辑。 - **方法重载**适用于希望一个方法名能适应多种数据类型的场景。例如,数学计算类中的 `CalculateArea()` 方法可以根据传入的参数(如半径、长宽等)计算不同几何图形的面积。 --- ### 注意事项 - 在进行方法重写时,必须确保基类方法是 `virtual`、`abstract` 或 `override` 的,否则无法覆盖其行为。 - 使用 `new` 关键字可以在子类中隐藏基类方法,但这不是真正的重写,也不会实现多态效果。 - 重载方法之间仅靠返回类型的不同是不合法的,因为 C# 编译器无法据此判断应调用哪一个方法[^5]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值