20141214--C#父类,子类

本文详细介绍了C#中的类继承概念,包括父类与子类之间的属性和方法的继承规则,以及如何在子类中使用父类的成员变量。同时探讨了不同访问修饰符的作用范围,并通过实例演示了在父类与子类间进行类型转换的过程。

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

首要:

子类 包含父类的所有的属性方法
所有子类都可以直接转化成父类类型
当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型。

父类与子类的装换:

Ren r = new Ren();
r = (Ren)m;//Man子类转换为Ren父类
Ren m1 = new Ren();
m1 = (Man)r;//转换成父类后再转换为子类时,只能转换成原先的子类, 不能转换成其他子类

需要使用强制装换。

private与protected:

private 只可在当前类中作为成员变量使用 。

protected 只可在当前类中或子类中作为成员变量 使用。

当初始化子类的时候,都会先初始化一下父类,并且,执行父类中的构造函数。

在父类中写入:

       private int hello;//private  只能在自己类里作为成员变量使用
        protected int world;//protected 只能在自己的类 以及子类里 作为成员变量使用
        public Ren()//构造函数(先执行)
        {
            world += 10;
            hello = 0;
       }
       public void ren1()
       {
            Console.WriteLine(world);
       }

在一个子类中:

class Man : Ren//加上“:Ren” 子类,表示Man是Ren的子类。
    {
         public Man()
        {
            world += 5; //在子类中可以使用protected的 变量。不可使用 private的变量。
        }
        public void man1()
        {
            Console.WriteLine(world);
        }
    }

在另一个子类中:

class women : Ren//加上“:Ren” 子类,表示women是Ren的子类。
    {
        public women()
        {
            world += 7;
        }
        public void women1()
        {
            Console.WriteLine(world);
        }
    }

主函数

static void Main(string[] args)
        {//子类 包含父类的所有的属性方法
            //所有子类都可以直接转化成父类类型
            //当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型。
              Ren rr = new Ren();
            rr.ren1();//打印结果是10

            Man m=new Man();
            m.man1();//打印结果是15

            women w = new women();
            w.women1();//打印结果是17
                     

            Console.ReadLine();
        }

 

当在父类中加入 static时

      private int hello;//private  只能在自己类里作为成员变量使用
       protected static int world;//protected 只能在自己的类 以及子类里 作为成员变量使用
       //注意此处,与上文不同,添加了一个static 静态变量(受保护)
       public Ren()//构造函数(先执行)
       {
            world += 10;
            hello = 0;
      }
      public void ren1()
      {
            Console.WriteLine(world);
      }

输出结果:

            Ren rr = new Ren();
            rr.ren1();//打印结果是10

            Man m=new Man();
            m.man1();//打印结果是25

            women w = new women();
            w.women1();//打印结果是42

其原理:

每次初始化(new)的时候被保护的变量都不会改变。

10+15=25;(第一个10是初始化Ren时的改变)

25+17=42;(25是初始化Man时的改变)

父类与子类的方法调用:

当子类父类中各有一个同名的方法时,new的是谁就调用谁的方法。

父类:

public void shuohua()
        {
            Console.WriteLine("说话:");
        }

Man子类:

public void shuohua()
        {
            Console.WriteLine("会英语");
        }

注意两个是同名的方法。

主函数中:

           m.shuohua();//调用的是Man中的方法    打印结果: 会英语
            rr.shuohua();//调用的是Ren中的方法   打印结果: 说话:

            rr = (Ren)m;//把Man类的m强制转换成Ren类。
            rr.shuohua();//调用的是Ren中的方法   打印结果: 说话:

            m = (Man)rr;//把Ren类rr强制转换成Man类。
            m.shuohua();//调用的是Man中的方法   打印结果: 会英语

image

转载于:https://www.cnblogs.com/Tirisfal/p/4162577.html

C#中,子类调用父类方法父类调用子类方法涉及的概念有所不同,因为默认情况下,子类只能访问其公开的(非私有的)父类成员。但通过以下方式可以实现: 1. **方法重写**(Overriding)[^1]: 子类可以直接覆盖父类的公共或保护方法,这样在子类实例上调用该方法时会执行子类的版本。例如: ```csharp class ParentClass { public virtual void ParentMethod() { Console.WriteLine("Parent method"); } } class ChildClass : ParentClass { public override void ParentMethod() { Console.WriteLine("Child method"); } } // 父类实例调用子类方法 var childInstance = new ChildClass(); childInstance.ParentMethod(); // 输出 "Child method" ``` 2. **虚方法**(Virtual Methods) 和 **接口** (Interfaces): 如果父类方法是虚方法,那么在子类中重新实现时,即使不显式指定override,也可以让父类实例调用子类的实现。如果子类实现了接口,接口方法也是虚的。 3. **Base关键字**: 在子类方法中,你可以使用`base.MethodName()`来直接调用父类方法,即使它不是虚方法。例如: ```csharp class ParentClass { public void NonVirtualMethod() { Console.WriteLine("Non-virtual method in parent"); } } class ChildClass : ParentClass { public void SomeMethod() { base.NonVirtualMethod(); // 直接调用父类的非虚方法 Console.WriteLine("Child's additional logic"); } } ``` 请注意,在实际项目中,这些策略应基于设计需求和代码组织考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值