앞서 언급했듯이 객체지향의 세 가지 주요 특징은 캡슐화, 상속, 다형성입니다. 우리는 이전 클래스의 정의에서 캡슐화에 대해 거의 완벽하게 이해했습니다. 이제 상속의 특징을 살펴보겠습니다.
상속은 실제로 한 클래스를 다른 클래스로 확장한 것입니다. 후자를 기본 클래스라고 하고 전자를 하위 클래스라고 합니다. 상속이란 하위 클래스가 기본 클래스의 모든 속성과 메서드를 가지며, 하위 클래스가 속성과 메서드를 추가할 수도 있음을 의미합니다. 그러나 하위 클래스는 상위 클래스의 속성과 메서드를 제거할 수 없습니다.
물론 여기서는 수정자 문제도 언급해야 합니다. 하위 클래스가 기본 클래스의 모든 속성과 메서드를 갖는다고 해서 하위 클래스가 이러한 상속된 속성과 메서드에 마음대로 액세스할 수 있다는 의미는 아닙니다. 서브클래스는 공용 및 보호 속성과 메서드에만 액세스할 수 있으며 나머지는 직접 액세스할 수 없습니다. 또 다른 점은 정적 유형이 클래스와 관련되어 있고 객체와 아무 관련이 없기 때문에 정적 속성과 메서드는 상속될 수 없다는 것입니다.
코드 보기:
using System; namespace YYS.CSharpStudy.MainConsole { public class YSchool { private int id = 0; private string name = string.Empty; public int ID { get { return this.id; } } public string Name { get { return name; } } /// <summary> /// 构造器 /// </summary> public YSchool() { this.id = 0; this.name = @"清华大学附中"; } /// <summary> /// 构造器 /// </summary> public YSchool(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 构造器 /// </summary> public YSchool(int id) { this.id = id; this.name = @"陕师大附中"; } } public class YTeacher { private int id = 0; private string name = string.Empty; private YSchool school = null; private string introDuction = string.Empty; private string imagePath = string.Empty; /// <summary> /// 使用只读属性,因为是固有属性。 /// </summary> public int ID { get { return id; } } public string Name { get { return name; } } /// <summary> /// 这几个使用get/set属性,因为这几个属性不是固有的,可以随着某些条件改变的。 /// </summary> public YSchool School { get { if (school == null) { school = new YSchool(); } return school; } set { school = value; } } public string IntroDuction { get { return introDuction; } set { introDuction = value; } } public string ImagePath { get { return imagePath; } set { imagePath = value; } } public YTeacher(int id, string name) { this.id = id; this.name = name; } /// <summary> /// 给学生讲课的方法 /// </summary> public void ToTeachStudents() { Console.WriteLine(string.Format(@"{0} 老师教育同学们: Good Good Study,Day Day Up!", this.name)); } /// <summary> /// 惩罚犯错误学生的方法 /// </summary> /// <param name="punishmentContent"></param> public void PunishmentStudents(string punishmentContent) { Console.WriteLine(string.Format(@"{0} 的{1} 老师让犯错误的学生 {2}。", this.School.Name, this.name, punishmentContent)); } } /// <summary> /// 男性老师,继承自YTeacher /// </summary> public class MrTeacher : YTeacher { /// <summary> /// 构造器,这里要注意,YTeacher是没有提供默认构造器的, /// 所以子类必须要有构造器,并且和基类参数列表一致。 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public MrTeacher(int id, string name) : base(id, name) { } /// <summary> /// 扩展的方法,刮胡子方法。 /// </summary> public void Shave() { Console.WriteLine(string.Format(@"{0} 老师用飞科剃须刀刮胡子。",this.Name)); } } /// <summary> /// 女性老师,继承自YTeacher /// </summary> public class MisTeacher : YTeacher { /// <summary> /// 构造函数 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public MisTeacher(int id, string name) : base(id, name) { } /// <summary> /// 扩展方法,护肤的方法 /// </summary> public void SkinCare() { Console.WriteLine(string.Format(@"{0} 老师用香奈儿护肤霜护肤。",this.Name)); } } }
using System; namespace YYS.CSharpStudy.MainConsole { class Program { static void Main(string[] args) { MrTeacher mrTeacher = new MrTeacher(1, @"牛轰轰"); mrTeacher.ToTeachStudents(); mrTeacher.PunishmentStudents(@"背唐诗"); mrTeacher.Shave(); MisTeacher misTeacher = new MisTeacher(2, @"郝漂靓"); misTeacher.ToTeachStudents(); misTeacher.PunishmentStudents(@"默写红楼梦"); misTeacher.SkinCare(); Console.ReadKey(); } }
결과:
상속은 객체 지향 기능이며 이점은 다음과 같습니다.
첫째, 클래스를 설계할 때 프로젝트의 경우 상속을 사용하면 많은 코드를 생략할 수 있습니다.
둘째, 객체지향의 클래스 구성 형태를 따릅니다. C#, Java와 같은 고급 객체지향 언어에는 객체 클래스가 있습니다. , 모든 클래스의 조상 클래스입니다.
상속 시 주의해야 할 사항 중 하나는 하위 클래스의 생성자입니다. 프로그램 실행 프로세스 중에 하위 클래스는 먼저 상위 클래스의 생성자를 호출합니다. 하위 클래스가 생성자를 작성하지 않으면 상위 클래스의 기본 생성자가 호출됩니다. 상위 클래스에 기본 생성자가 없는 경우, 즉 상위 클래스가 매개변수가 있는 생성자를 작성하는 경우 하위 클래스는 매개변수가 있는 생성자를 호출하지만 호출되는 매개변수가 있는 생성자를 지정해야 합니다(기본 코드 참조). ).
위 내용은 C# 기초지식: 기초지식(4) 상속에 대한 요약입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!