C#基础(14)——继承、new

1、继承父类

将重复的成员封装到一个类中,子类继承父类的公有字段、属性、方法
子类:派生类
父类:基类
子类没有继承父类的私有字段
这里写图片描述
这里写图片描述

public class Student:Person

子类有没有继承父类的构造函数?
1)当根性:子类只有一个父类
2)传递性:teacher是继承person,student继承teacher
当父类中定义构造函数时,报如下错误:
这里写图片描述
说明默认的构造函数被干掉了,继承时只有new一个对象的构造函数,才是真正创建了一个父类对象,父类成员才可以使用,要补一个无参的就可以。
1)父类重新写一个无参的构造函数;
2)在子类中显示的调用父类的有参构造函数,使用关键字:base(),这个常用;
这里写图片描述

这里写图片描述

说明子类并没有继承父类的构造函数。但是子类会调用父类无参的构造函数,要创建父类对象,才能使用父类的成员。

2、查看类图

这里写图片描述
这里写图片描述
Person:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChuangzhiConsel
{
    public class Person
    {
        //构造函数
        public Person(string name, char gender, int age)
        {
            this.Name = name;
            this.Gender = gender;
            this.Age = age;
        }
        //构造函数重载
        public Person(string name): this(name,'男',2)
        {
        }
        //构造函数重载
        public Person(string name, char gender): this(name, gender, 0)
        {
        }
        //无参的构造函数
        //public Person()
        //{

        //}

        //字段
        private string _name;
        public string Name //属性
        {
            get { return _name; }//当输出打印时
            set { _name = value; }//当给属性赋值时
        }

        //字段
        private int _age;
        public int Age //属性
        {
            get { return _age; }
            set
            {
                if (value < 0 || value > 120)
                {
                    value = 0;
                }
                _age = value;
            }
        }

        //字段
        private char _gender;
        public char Gender//属性
        {
            get
            {
                if (_gender != '男' && _gender != '女')//也可以在set里设置
                {
                    return _gender = '男';
                }
                return _gender;
            }
            set { _gender = value; }
        }


        //方法
        public void PrintInformation()
        {
            Console.WriteLine("我叫{0},今年{1}岁了,性别:{2}!", this.Name, this.Age, this.Gender);
        }


    }
}

Student:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChuangzhiConsel
{
    public class Student:Person
    {
        public Student(string name, char gender, int age, int chinese, int math, int english):base(name,gender,age)
        {
            this.Chinese = chinese;
            this.Math = math;
            this.English = english;
        }

        //语文
        private int _chinese;
        public int Chinese
        {
            get { return _chinese; }
            set { _chinese = value; }
        }
        //数学
        private int _math;
        public int Math
        {
            get { return _math; }
            set { _math = value; }
        }
        //英语
        private int _english;

        public int English
        {
            get { return _english; }
            set { _english = value; }
        }

        //方法
        public void PrintInfo()
        {
            Console.WriteLine("我叫{0},今年{1}岁,是一名{2}生!", this.Name, this.Age, this.Gender);
        }

        public void PrintScore()
        {
            Console.WriteLine("我的英语成绩:{0},语文成绩:{1},数学成绩{2},总分:{3},平均分:{4}",this.English,this.Chinese,this.Math,
                this.English+this.Chinese+this.Math,(this.English+this.Chinese+this.Math)*1.0/3);
        }
    }
}

Teacher:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChuangzhiConsel
{
    public class Teacher:Person
    {
        public Teacher(string name,char gender,int age,double salary):base(name,gender,age)
        {
            this.Salary = salary;
        }

        private double _salary;
        public double Salary
        {
            get { return _salary; }
            set { _salary = value; }
        }


        public void Sleep()
        {
            Console.WriteLine("老师功能:睡觉啦!");
        }
    }
}

3、继承练习

在C#中,所有的类都直接或者间接地继承自object类,当我们定义一个类时,没有写明“:”继承哪个类,那么这个类就继承了object。
这里写图片描述
PersonInfo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 练习
{
    public class PersonInfo
    {
        //Constructor
        public PersonInfo(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        //Fields
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
    }
}

Reporter:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 练习
{
    public class Reporter:PersonInfo
    {
        public Reporter(string name, int age, string habit)
            : base(name, age)
        {
            this.Habit = habit;
        }

        //Fields
        private string _habit;
        public string Habit
        {
            get { return _habit; }
            set { _habit = value; }
        }
        //Method
        public void Reorting()
        {
            Console.WriteLine("我叫{0},一名记者,我的爱好是{1}", this.Name, this.Habit);
        }
    }
}

Programmer:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 练习
{
    class Programmer:PersonInfo
    {
        //Constructor
        public Programmer(string name, int age, int seniority)
            : base(name, age)
        {
            this.Seniority = seniority;
        }

        public Programmer(string name, int seniority)
            : base(name, 0)
        {
            this.Seniority = seniority;
        }

        //Fields
        private int _seniority;
        public int Seniority
        {
            get { return _seniority; }
            set { _seniority = value; }
        }


        //Methods
        public void Programming()
        {
            Console.WriteLine("我叫{0},一名程序员,今年{1}岁了,已经工作了{2}年。", this.Name, this.Age, this.Seniority);
        }
    }
}

Main:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 练习
{
    class Program
    {
        static void Main(string[] args)
        {
            Reporter reporter1 = new Reporter("Alex", 22, "写作");
            Programmer programmer1 = new Programmer("David", 32, 10);
            reporter1.Reorting();
            programmer1.Programming();
            Console.ReadKey();
        }
    }
}

4、new关键字

1)创建对象
2)当子类与父类的方法同名时,隐藏从父类那里继承过来的成员,即将public方法后加“new”

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《轻松学C#(图解版)》完整扫描版================================================================ 基本信息 作者:谷涛、扶晓、毕国锋 丛书名:轻松学开发 出版社:电子工业出版社 ISBN:978-7-121-20223-0 出版日期:2013年6月 开本:16开 页码:408页 版次:1-1 定价:¥55.00 所属分类:计算机 > 软件与程序设计 > C# ================================================================ 内容简介 本书由浅入深,全面、系统地介绍了C#程序设计。除了详细地讲解C#知识点外,本书还提供了大量的实例,供读者实战演练。本书共分三篇。第一篇是C#概述篇,主要介绍的是Visual Studio 2012的开发环境及搭建。第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、流程控制、数组、继承、属性、运算符重载、接口等C#基本内容。第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类型标识、反射、特性、泛型、LINQ和数据库开发等。 ================================================================ 图书目录 第一篇 C#概述篇 第1章 C#入门 2 1.1 C#概述 2 1.1.1 C#的发展 2 1.1.2 C#开发的基础 2 1.2 搭建开发环境 3 1.2.1 Visual Studio 2012软硬件配置要求 3 1.2.2 下载Visual Studio 2012 3 1.2.3 安装Visual Studio 2012 4 1.2.4 初始化配置 7 1.3 第一个程序—Hello World 8 1.4 小结 11 1.5 习题 12 第二篇 面向对象基础篇 第2章 类和对象 16 2.1 分析Hello World程序 16 2.2 语法规范 17 2.2.1 标识符 17 2.2.2 关键字 18 2.2.3 注释 19 2.3 定义类 20 2.4 实例化对象 20 2.5 小结 20 2.6 习题 21 第3章 定义类——字段 23 3.1 数据类型 23 3.1.1 简单值类型 23 3.1.2 值的表示——字面量 26 3.1.3 转义序列 27 3.2 定义字段 27 3.2.1 定义字段 28 3.2.2 静态字段和实例字段的访问 28 3.2.3 字段初始化 29 3.2.4 字段的动态赋值——Read()和ReadLine() 31 3.2.5 字段输出 31 3.2.6 格式化输出 32 3.2.7 数据类型转换 39 3.2.8 只读字段 41 3.2.9 访问控制 41 3.3 运算符 43 3.3.1 算术运算符 43 3.3.2 自增、自减运算符 44 3.3.3 复合赋值运算符 45 3.3.4 位运算符 46 3.3.5 sizeof运算符 47 3.3.6 运算符的优先级 47 3.4 小结 49 3.5 习题 49 第4章 定义类——方法 51 4.1 方法的概述 51 4.1.1 定义方法 51 4.1.2 方法的调用 52 4.2 方法体的构成 53 4.2.1 局部变量 53 4.2.2 局部变量与字段同名的解决——this关键字 54 4.2.3 语句 55 4.2.4 全局变量 55 4.3 返回值 56 4.3.1 返回值类型 56 4.3.2 从方法返回 57 4.4 参数 58 4.4.1 参数的分类 58 4.4.2 引用参数(ref参数) 59 4.4.3 输出参数(out参数) 61 4.5 特殊的方法 62 4.5
C#中的各种名词: 常数:声明时用const修饰,是隐式静态类型 域:一个代表和某对象或类相关的变量的成员 字段:和属性相同,是用来存储对象的值,可以直接访问数据且不能对数据添加任何限制,但是属性不能且可以对数据添加访问限制。一个在类或结构的定义中声明的变量。可以被这个类或者结构的所有成员函数(方法、构造函数)使用,可以是值类型或引用类型,主要有实例字段和静态字段。区别于局部变量在于局部变量只能被给定的函数或代码块使用 属性:一种用于访问对象或类的特性的成员。属性的访问器是一种使属性可以像公共数据成员一样被使用的特殊方法(get/set方法)。属性结合了字段和方法的多个方面,对于对象的用户,它显示为字段;对于类的实现者,它是一个或两个代码块(用于表示get/set访问器)。写类的时候使用System.Serializable属性以便使类的成员可以序列化 方法:是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面,对于那些私有的字段来说,外部界面实现对它们的操作一般只能通过方法来实现。方法在类或结构中声明,声明时需要制定访问级别、返回值、方法名称及方法参数。一个方法的签名由它的名称以及它的形参的个数、修饰符和类型组成。方法的签名是方法的唯一标识(同一个类中的区别标识)。 方法的重载:是指方法名相同,但参数类型、个数或顺序不同的方法,与返回值无关(同一类或子类之间) 方法的重写:子类对父类方法的重新实现(方法头相同,方法体即代码块不同) 事件:是使得对像和类提供通知的成员。一个类通过提供事件声明来定义一个事件,这看起来与域和事件声明相当类似,但是有一个event关键字。这个声明的类型必须是delegate类型。如下例子: public delegate void EventHandler(object sender, Event e); public class Button { public event EventHandler Click; public void Reset() { Click = null; } } 索引:是使得对象可以像数组一样被索引的成员 结构:一种值类型,几个数据组成的数据结构。向方法传递结构时,是通过传值方式传递的,结构实例化可以不用new,结构可以声明构造函数,但必须带参数,且声明的构造函数是用来对成员初始化的,必须包含每个字段。结构不能从另一个结构或类继承而来,但可以实现接口,结构中不能初始化实例。结构存储在栈中且只用来表示小的数据结构,类存储在托管堆中 类:是一种数据结构,是具有相同或相似结构、操作和约束规则的对象组成的集合。算法和数据结构的集合(对象),具有封装、继承、多态等特点。父类—基类、子类—派生类。类的多态是指不同的类进行同一操作可以有不同的行为。类是相同对象的集合,并为这些对象定义了编程语言上的属性和方法。类修饰符:new在类声明时使用,public公共的,访问不受限,protected只能从其所在类和所在类的子类中进行访问,internal只有其所在类才能进行访问,private私有的,abstract抽象类,不能实例化,sealed密封类,不能被继承 虚拟成员:声明为virtual的类成员 析构函数:以类名+~来命名的,不能有参数,不能有任何修饰符而且不能被调用。当某个类的实例被认为不再有效并符合析构条件时,.NET Framework类库的垃圾回收功能就会调用该类的析构函数实现垃圾回收,一个类只能有一个析构函数。一般准则是,除非有迫不得已的原因,不要使用析构函数,而应把清楚操作交给运行时完成 接口:声明的所有成员隐式的为public和abstract。在命名空间中声明的接口可以被授予public或internal访问类型。嵌套的接口可以被授予public、protected、internal、protected internal或private访问类型。默认为internal.接口的成员隐式的被声明为public和abstract访问类型且没有实现没有修饰符 密封类:密封类不能作为基类被继承,但可以继承别的类或接口,密封类中不能声明受保护的成员或虚成员,密封类不能声明为抽象的,声明密封类用sealed.密封方法只能用于对基类的虚方法进行实现,声明密封方法时同时使用sealed和override且必须通过重写基类中的虚方法来实现 名称空间:类似java中的包 集合: 代表: 访问修饰符:private、public、protected、internal:局部的 readonly:只读修饰符 new(新的)、static(静态的)、virtual(虚拟的)、override()、sealed(密封的)、abstranct(抽象的)、extern(外面的) 派生类调用基类的方法可以使用base关键字,如base.Method();

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以问天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值