C#类的继承:子类--父类
来源:互联网 发布:会声会影x8注册机 知乎 编辑:程序博客网 时间:2024/06/04 04:35
为了避免冗余,将几个类中重复的成员单独拿出来封装成一个类,作为这几个类的父类。
父类---子类 基类----派生类
子类没有继承到父类的私有(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,失败返回FALSETeacher tt=(Teacher)s;}else { }或者使用asTeacher 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"); } } }}
- C#类的继承:子类--父类
- C#中的类,子类,类的继承(待续)
- C# 继承 子类(派生类) 父类(基类)
- c# abstract抽象类与继承类子类的构造函数_base
- C#中的类,子类,类的继承,重构,虚方法,protected(续)
- 子类继承父类的一个问题
- 子类继承父类的语法规则
- 子类继承父类的私有属性
- 子类继承父类的static方法
- 子类继承父类的私有属性
- 子类继承父类的私有成员
- 子类继承父类的私有属性
- 子类继承父类的构造方法
- Java子类与父类的继承
- 子类的继承
- 子类的继承性
- 继承的顺序,子类覆盖继承父类的方法
- java中的继承-子类继承父类的权限问题
- Android HttpURLConnection断点下载(单线程)
- C++贪心算法实列
- 20170526
- 插件化知识详细分解及原理 之Binder机制
- JavaWeb三大组件之一Servlet【request讲解】
- C#类的继承:子类--父类
- Ubuntu下Apache2的CGI简单配置
- 记录梦幻手游PC端辅助开发及设计思路之整体架构
- Cloudera Manager 5和CDH5离线安装,CDH-5.7.1
- 第四次数据结构上机
- java代码创建数据库表
- CentOS7修改网卡名eno*为eth0
- MongoDB分片环境下整体数据迁移解决方案
- ELK系列-logstash跟logback结合