C#类的继承:子类--父类

转至:https://blog.csdn.net/yanhuatangtang/article/details/72772215

为了避免冗余,将几个类中重复的成员单独拿出来封装成一个类,作为这几个类的父类。

父类---子类       基类----派生类

子类没有继承到父类的私有(private)字段,可以继承属性(public)和方法。

1、一个子类只能有一个父类(单根性)

2、可以传递性继承(传递性)

查看类之间的关系可以通过  查看类图选项,  选中解决方案,右键,查看类图。

子类没有继承父类的构造函数

子类会默认调用父类的无参数构造函数,因为要创建父类对象,让子类可以使用父类中的成员。如果在父类中重新写了一个有参数的构造函数,无参数的构造函数被覆盖,子类就无法调用无参数的构造函数,子类报错。

解决方法:

1、在父类中重新写一个无参数的构造函数;

2、在子类中显示的调用父类的有参数的构造函数,使用关键字base( );  // 一般使用此方法

子类中的方法名和父类中的方法名相同时,子类将父类的方法自动隐藏。在方法名前面加上关键字new,彻底将从父类继承的方法隐藏。

子类可以直接调用父类的方法。
 

public class Person
    {
        string _name;
        public string Name
        {
            get{return  _name;}
            set{_name=value;}
        }
        public Person(string name)
        {
            this.Name=name;
        }    
    }
public class student:Person
{
    public  strudent(string  name, int gender,int age,int id) 
        :base(name,gender,age)
{
    this.Id=id;
}
}
public class teacher:Person
{
 
}

在项目中不应该把类都放在一个项目中。

   //  正确显示的格式
         int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        student(string name,int ag)
            : base(name)
        {
            _age = Age;
        }

假设父类子类都含有方法  public void  print(){   }
若在子类中将此方法隐藏,则为 public new  void print() {    }

再次总结new的作用:

1、创建对象;

2、隐藏父类那里继承过来的同名成员,使子类调用不到父类的成员。

如果一个类没有继承其他类,默认继承object类;其实:在C#中所有的类都直接或间接的继承object类。

调用(父类与子类)

子类对象可以调用父类对象的成员,但是父类对象不可以调用子类的成员,只能调用自身的成员。

1、子类可以赋值给父类:应用  如果有一个地方需要一个父类做参数,我们可以用一个子类代替。
 

Person  per=new student(); 或者写成
Student  str=new  student ( );
Person s=str; 

2、如果父类中装的是子类对象,那么可以将父类强制转换为子类对象;
如 上面的例子,满足Person s=str;   则 强制转换 : student   ss = (student) s;

由于teacher是person的子类,但是不可以teacher tt=(teacher)s;  因为父类中装的是子类student中的对象。

需要进行判断一下,使用is  或者  as
 

if(s is teacher){  // 成功返回TRUE,失败返回FALSE
Teacher tt=(Teacher)s;
}else {  }
或者使用as
Teacher  t= s as Teacher;  //  成功返回正确结果,错误返回NULL

父类与子类举例:

namespace convert
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] people = new Person[10];  // 存在了父类数组中
            Random num = new Random();
            for (int i = 0; i < 10; i++)
            {
                int rand = num.Next(1, 6);  // 产生随机数,注意这里是产生1-6之间的随机数,不包括6,  只产生0 、1、2、3、4、5
                switch (rand)
                {
                    case 1:
                        people[i] = new Vivi(); // 子类可以赋值给父类
                        break;
                    case 2:
                        people[i] = new Ququ();
                        break;
                    case 3:
                        people[i] = new Evil();
                        break;
                    case 4:
                        people[i] = new Wea();
                        break;
                    case 5:
                        people[i] = new Ewi();
                        break;
                    default:
                        people[i] = new Person();
                        break;
                }
            }
            for (int i = 0; i < 10; i++)
            {
                if (people[i] is Vivi)
                {
                    ((Vivi)people[i]).showvivi();  //  父类可以转换为子类(前提是父类装的是子类)
                }
                else if (people[i] is Ququ)
                {
                    ((Ququ)people[i]).showququ();
                }
                else if (people[i] is Evil)
                {
                    ((Evil)people[i]).showevil();
                }
                else if (people[i] is Wea)
                {
                    ((Wea)people[i]).showwea();
                }
                else if (people[i] is Ewi)
                {
                    ((Ewi)people[i]).showpeewi();
                }
            }
            Console.ReadKey();
        }
        // 父类与子类的关系  5个子类
        public class Person
        {
            public void showpeson()
            {
                Console.WriteLine("hello,i'm person");
            }
        }
        public class Vivi : Person
        {
            public void showvivi()
            {
                Console.WriteLine("hello,i'm vivi");
            }
        }
        public class Ququ : Person
        {
            public void showququ()
            {
                Console.WriteLine("hello,i'm Ququ");
            }
        }
        public class Evil : Person
        {
            public void showevil()
            {
                Console.WriteLine("hello,i'm Evil");
            }
        }
        public class Wea : Person
        {
            public void showwea()
            {
                Console.WriteLine("hello,i'm Wea");
            }
        }
        public class Ewi : Person
        {
            public void showpeewi()
            {
                Console.WriteLine("hello,i'm ewi");
            }
        }
 
    }
}

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值