zoukankan      html  css  js  c++  java
  • part01.01 C#基础语法与逻辑控制(五)(7. C# 继承和接口)

    C# 继承和接口

    继承

    继承(以及封装和多态性)是面向对象的编程的三个主要特征之一。通过继承,可以创建重用、扩展和修改在其他类中定义的行为的新类。其成员被继承的类称为 “基类” ,继承这些成员的类称为 “派生类” 。派生类只能有一个直接基类。但是,继承是可以传递的。如果 ClassC 派生自 ClassB ,并且 ClassB 派生自 ClassA ,则 ClassC会继承在 ClassB 和 ClassA 中声明的成员。

    继承的代码实现:

     1     /// <summary>
     2     /// 构建一个工作项的业务类(缺省继承自基类Object)
     3     /// </summary>
     4     public class WorkItem
     5     {
     6         private static int currentID;   //  用于存储最新加入的工作项的ID的静态字段
     7 
     8         protected int ID { get; set; }  //  工作项标识符
     9         protected string Title { get; set; }    //  名称
    10         protected string Description { get; set; }  //  说明
    11         protected TimeSpan JobLength { get; set; }  //  所需时长
    12 
    13         public WorkItem()
    14         {
    15             ID = 0;
    16             Title = "缺省的工作名称";
    17             Description = "简单的描述";
    18             JobLength = new TimeSpan();
    19         }
    20 
    21         public WorkItem(string title,string desc,TimeSpan joblen)
    22         {
    23             this.ID = GetNextID();
    24             this.Title = title;
    25             this.Description = desc;
    26             this.JobLength = joblen;
    27         }
    28 
    29         /// <summary>
    30         /// 静态构造函数,用来初始化静态属性
    31         /// </summary>
    32         static WorkItem()
    33         {
    34             currentID = 0;
    35         }
    36 
    37         /// <summary>
    38         /// 构建下一个对象的ID
    39         /// </summary>
    40         /// <returns></returns>
    41         protected int GetNextID()
    42         {
    43             return ++currentID;
    44         }
    45 
    46         /// <summary>
    47         /// 更新
    48         /// </summary>
    49         /// <param name="title"></param>
    50         /// <param name="joblen"></param>
    51         public void Update(string title,TimeSpan joblen)
    52         {
    53             this.Title = title;
    54             this.JobLength = joblen;
    55         }
    56 
    57         public override string ToString()
    58         {
    59             return String.Format("{0}-{1}", this.ID, this.Title);
    60         }
    61     }
    62     
    63     /// <summary>
    64     /// 变更工作项请求
    65     /// </summary>
    66     public class ChangeRequest : WorkItem
    67     {
    68         protected int originalItemID { get; set; }   //  原来安排工作项的ID
    69 
    70         public ChangeRequest()
    71         {
    72 
    73         }
    74         public ChangeRequest(string title,string desc,TimeSpan joblen,int originalID)
    75         {
    76             this.ID = GetNextID();
    77             this.Title = title;
    78             this.Description = desc;
    79             this.JobLength = joblen;
    80 
    81             this.originalItemID = originalID;
    82         }
    83     }
    View Code

    继承的实际应用

     1  /// <summary>
     2     /// 继承的实际应用
     3     /// </summary>
     4     public static class Inheritence
     5     {
     6         public static void ToInheritence()
     7         {
     8             //  定义一个工作项
     9             WorkItem item = new WorkItem("修复 Bugs", "修复当前代码的全部 bug", new TimeSpan(3, 4, 0,0));
    10 
    11             //  定义一个工作项变更要求
    12             ChangeRequest change = new ChangeRequest("变更基类设计内容", "添加类成员", new TimeSpan(4, 0, 0), 1);
    13 
    14             Console.WriteLine(item.ToString());
    15 
    16             //Console.WriteLine(change.ToString());
    17 
    18             change.Update("进一步变更基类设计内容", new TimeSpan(4, 0, 0));
    19 
    20             Console.WriteLine(change.ToString());
    21             Console.ReadKey();
    22         }
    23     }
    View Code

    抽象类(abstract)

    抽象类不能实例化,抽象类的用途是提供一个可供多个派生类共享的通用基类定义。例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类类提供自己的类实现(说明:不完整且必须在派生类中实现的类和类成员)

    相关代码:

     1 /// <summary>
     2     /// 抽象类,不能实例化(一个没有构造函数的类)
     3     /// 用途是提供一个可供多个派生类共享的通用基类定义(如:
     4     /// 类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该类库的程序员通过创建派生类来提供自己的类实现
     5     /// </summary>
     6     public abstract class StudentUpdateLog
     7     {
     8         public Guid ID { get; set; }
     9         public DateTime UpdateTime { get; set; }    //  更新时间
    10         public string Description { get; set; }  //  变更说明
    11         
    12         public virtual Student Student { get; set; }    //  关联学生
    13 
    14         public abstract void SetDescription(string desc);  //  设置变更说明
    15     }
    16 
    17     /// <summary>
    18     /// 学生教学班变更记录
    19     /// </summary>
    20     public class StudentSchoolClassUpdateLog : StudentUpdateLog
    21     {
    22         public SchoolClass OrogianlSchoolClass { get; set; }    //  原来班级
    23         public SchoolClass CurrentSchoolClass { get; set; }     //  当前
    24 
    25         public StudentSchoolClassUpdateLog()
    26         {
    27             this.ID = Guid.NewGuid();
    28             this.UpdateTime = DateTime.Now;
    29         }
    30         
    31         /// <summary>
    32         /// 如果在抽象类中定义了方法,那么必须在它的派生类中实现
    33         /// </summary>
    34         /// <param name="desc"></param>
    35         public override void SetDescription(string desc)
    36         {
    37             this.Description = desc;
    38         }
    39     }
    View Code

    接口类

    (接口包含类或结构可以实现的一组相关功能的定义)

    。接口类似于抽象基类。实现接口的任何类或接口多必须实现其所有成员。

    。接口无法直接进行实例。其成员由实现接口的任何类或接口来实现。

    。接口可以包含事件、索引器、方法和属性。

    。一个类或结构可以实现多个接口。

    。一个类可以继承一个基类,还可以实现一个或多个接口。

     1     /// <summary>
     2     /// 用于描述相等性的接口
     3     /// </summary>
     4     /// <typeparam name="T">待指定类型的类型</typeparam>
     5     public interface IEquatable<T>
     6     {
     7         string GetMake();   //  获取制造商
     8         string GetModle();  //  获取类型
     9         string GetYear();   //  获取年份
    10 
    11         /// <summary>
    12         /// 只定义方法、返回值、参数、没有定义任何具体的实现
    13         /// </summary>
    14         /// <param name="obj">T所限定类型的对象</param>
    15         /// <returns></returns>
    16         bool Equals(T obj);
    17     }
    18 
    19     public class Car : IEquatable<Car>
    20     {
    21         public string Make { get; set; }
    22         public string Modle { get; set; }
    23         public string Year { get; set; }
    24         
    25         public Car(string make,string modle,string year)
    26         {
    27             this.Make = make;
    28             this.Modle = modle;
    29             this.Year = year;
    30         }
    31 
    32         //  实现 IEquatable<T> 接口
    33         public bool Equals(Car obj)
    34         {
    35             if (this.Make == obj.Make && this.Modle == obj.Modle && this.Year == obj.Year)
    36                 return true;
    37             else
    38                 return false;
    39         }
    40 
    41         //  实现接口类 IEquatable<T> 的成员方法
    42         public string GetMake()
    43         {
    44             return Make;
    45         }
    46 
    47         public string GetModle()
    48         {
    49             return Modle;
    50         }
    51 
    52         public string GetYear()
    53         {
    54             return Year;
    55         }
    56     }
    57 
    58     /// <summary>
    59     /// 接口类的实现
    60     /// </summary>
    61     public static class InterfaceClass
    62     {
    63         public static void ToInterface()
    64         {
    65             //  创建 Car 实例
    66             Car car1 = new Car("宝马", "跑车", "2017");
    67             Car car2 = new Car("宝马", "跑车", "2016");
    68             bool b= car1.Equals(car2);
    69             if (b == true)
    70                 Console.WriteLine("相同");
    71             else
    72                 Console.WriteLine("额不相同");
    73 
    74             //  声明一个转型的 IEquatable,没有创建
    75             IEquatable<Car> hehe = (IEquatable<Car>)car1;
    76 
    77             Console.WriteLine("Make:{0},Model{1},Year{2}", car1.Make, car1.Modle, car1.Year);
    78 
    79             Console.WriteLine("hMake:{0},hModel{1},hYear{2}", hehe.GetMake(), hehe.GetModle(), hehe.GetYear());
    80 
    81             Console.ReadKey();
    82         }
    83     }
    View Code
  • 相关阅读:
    【leetcode】1295. Find Numbers with Even Number of Digits
    【leetcode】427. Construct Quad Tree
    【leetcode】1240. Tiling a Rectangle with the Fewest Squares
    【leetcode】1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold
    【leetcode】1291. Sequential Digits
    【leetcode】1290. Convert Binary Number in a Linked List to Integer
    【leetcode】1269. Number of Ways to Stay in the Same Place After Some Steps
    【leetcode】1289. Minimum Falling Path Sum II
    【leetcode】1288. Remove Covered Intervals
    【leetcode】1287. Element Appearing More Than 25% In Sorted Array
  • 原文地址:https://www.cnblogs.com/huangzewei/p/7278651.html
Copyright © 2011-2022 走看看