L'abstraction peut se faire par des classes abstraites ouInterfacePour réaliser.
abstractMots clés pour les classes et les méthodes:
- Classe abstraite:Est une classe restreinte,Ne peut pas être utilisé pour créer des objets(Pour y accéder,Doit hériter d'une autre classe).
- Méthode abstraite:Ne peut être utilisé que dans des classes abstraites,Et c'estPas de sujet.Le principal est la mise en œuvre concrète de la classe dérivée(De)Offre.
Les classes abstraites peuvent avoir des méthodes abstraites et des implémentations,Il y a au moins une méthode abstraite.
Essayez de parler d'une classe abstraiteEmployeePour instancier,Les questions erronées sont indiquées ci - dessous.;

- Exemple:Procédures statistiques sur les salaires des employés
Il y a maintenant quatre catégories d'employés:
- Employés à salaire fixe 2.Employés du temps 3.Personnel à Commission 4.Salaire de base+Personnel à Commission
Après analyse:
1.Tous les employés ont des messages communs,【Nom】【Numéro d'emploi】Ces deux - là sont membres du champ,Une abstractionEarning()Méthode de calcul de la rémunération,Une réécrituretoString()Pour afficher les informations de base;
Toutes définissent une classe abstraite,Comme indiqué ci - dessus4Catégorie de base des employés,Contient2Variables membres,1Constructeurs,1Réécritoveride string ToString()Méthodes:
/// <summary> /// Classe de baseEmployee /// </summary> public abstract class Employee// Créer une classe de base abstraite { protected Employee(string name, string ssd)//Constructeur { Name = name; SSD = ssd; } public string Name { get;private set; } public string SSD { get;private set; } public override string ToString()//Méthode de réécriture { return string.Format($"Nom:{Name}\nNuméro d'emploi:{SSD}"); } public abstract decimal Earning();//Méthode abstraite }
2.Et puis..., Définir la première catégorie d'employés à rémunération fixe , Il héritera de ce qui précède EmployeeClasse de base, Employés à rémunération fixe , C'est plus qu'un salaire de base. monthSalary, En tant que membre du champ , Et créer des propriétés pour ,Attention àsetÀ utiliserprivateModification, Exprimé comme privé , Non modifiable à l'extérieur ;Méthode de construction, Il est important de noter que les paramètres hérités de la classe de base nameEtssdAdoption :base(name,ssd)Affectation;
/// <summary> /// 1Employés à salaire fixe /// </summary> public class MonthEmployee:Employee { private decimal monthSalary; public decimal MonthSalary//Propriétés { get { return monthSalary; } set { monthSalary = value > 0 ? value : 0; }// Notez que l'expression de sélection ici est deux points : } public MonthEmployee(string name, string ssd, decimal salary):base(name,ssd)//Constructeur { MonthSalary = salary; } public override decimal Earning() { return MonthSalary; } public override string ToString() { return string.Format($" Salariés >>\n{base.ToString()}\nSalaire:{MonthSalary:C}"); } }
3.Ibid.,Article premier2Catégorie de personnel:Employés du temps, C'est plus que la classe de base. 2Champs,1 Un salaire horaire. ,1 C'est l'usine au travail. ,Les codes sont les suivants::
/// <summary> ///2 Salariés horaires /// </summary> public class HourlyEmployee:Employee { private double hours; private decimal hourSalary; public HourlyEmployee(string name,string ssd,double hours, decimal hourSalary):base(name,ssd) { this.hours = hours; this.hourSalary = hourSalary; } public double Hours { get { return hours; } private set { hours = value > 0 ? value : 0; } }//Propriétés1 public decimal HourSalary { get { return hourSalary; } private set{hourSalary = value > 0 ? value : 0; }}//Propriétés2 public override decimal Earning() { if (hours <= 40) { return hourSalary * (decimal)hours; } else { return 40 * hourSalary + (decimal) (hours - 40) * hourSalary*1.5M;//Plus que40HHeures supplémentaires } } public override string ToString() { return string.Format($" Salariés horaires >>\n{base.ToString()}\nHeures de travail:{Hours}\nSalaire:{Earning():C}"); } }
4.Ibid.,Article premier3Catégorie de personnel:Personnel à Commission, C'est plus que la classe de base. 2Champs,1 C'est le chiffre d'affaires. ,1 L'un est l'échelle de la Commission. ,Les codes sont les suivants::
/// <summary> /// 3Personnel à Commission /// </summary> public class SaleEmployee : Employee { private decimal sale; private decimal saleRatio; public decimal Sale { get { return sale; }private set { sale = value > 0 ? value : 0; } } public decimal SaleRatio { get { return saleRatio; } private set { saleRatio = value > 0 ? value : 0; } } public SaleEmployee(string name, string ssd, decimal sale, decimal saleRatio) : base(name, ssd) { this.Sale = sale; this.SaleRatio = saleRatio; } public override decimal Earning() { return sale * saleRatio; } public override string ToString() { return string.Format($"Personnel à Commission>>\n{ base.ToString()}\nVentes:{sale}\nSalaire:{Earning()}"); } }
5.Et puis...,Article premier4 Salaire de base des employés +Personnel à Commission, Ces employés sont rémunérés sur la base des employés à Commission susmentionnés. , Plus une partie du salaire de base ;Alors..., Cette catégorie découle de ce qui précède. SaleEmployeeCatégorie; Mais il a un champ de plus. ;
/// <summary> /// 4 Salaire de base /// </summary> public class BaseSaleEmployee : SaleEmployee { private decimal baseSalary; public decimal BaseSalary { get { return baseSalary; } private set { baseSalary = value > 0 ? value : 0; } } public BaseSaleEmployee(string name, string ssd, decimal sale, decimal saleRatio,decimal baseSalary) : base(name, ssd,sale,saleRatio) { this.BaseSalary = baseSalary; } public override decimal Earning() { return Sale * SaleRatio+baseSalary; } public override string ToString() { return string.Format($"Salaire de base+Personnel à Commission>>\n{ base.ToString()}\nSalaire de base:{baseSalary}"); } }
Voilà.,4Catégorie de personnel+1 Tous les employés de la classe de base abstraite ont terminé la conception. .InVSMoyenne, Vous pouvez sélectionner le bouton droit dans la vue de classe comme indiqué ci - dessous. ,Voir le diagramme de classe(PS: Si le bouton droit n'a pas cette option ,- Oui.vs Composant d'installation manquant ,Connexion de référence:VS 2019 Comment voir un diagramme de classe [email protected] de-CSDNBlogs_vsVoir le diagramme de classe


Enfin: Démontrer l'utilisation des classes ci - dessus dans le programme principal ;
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 var EP1 = new MonthEmployee("Wang Meng","1111",800M); 6 var EP2 = new HourlyEmployee("Li Yi", "2222", 70,20M); 7 var EP3 = new SaleEmployee("Zhang Yu", "3333", 15070, 0.05M); 8 var EP4 = new BaseSaleEmployee(" Zhao Xiong ", "4444", 17070, 0.04M,500); 9 10 Employee[] emp = new Employee[4]; 11 emp[0] = EP1; emp[1] = EP2; emp[2] = EP3; emp[3] = EP4; 12 13 Console.WriteLine("=============== Voici l'impression du tableau ============="); 14 int i = 0; 15 foreach (var item in emp) 16 { 17 i++; 18 Console.WriteLine(item); 19 Console.WriteLine("-----------------------{0}-----------------------", i); 20 } 21 Console.ReadLine(); 22 } 23 }
Résultats obtenus:

Jusqu'ici., Résumé de l'apprentissage des classes abstraites et dérivées .
Enfin,Merci beaucoup.B Professeur Cui de l'Université Xi'an Jiaotong dans la vidéo gratuite et la vidéo de la station ;Liens:C#Programmation Xi'an Jiaotong University C#Tutoriel de démarrage de base_Bip, bip, bip_bilibili
^(* ̄(oo) ̄)^J'espère que vous apprécierez vos études.!



![洛谷:P3092 [USACO13NOV]No Change G(状压+二分,独特的状态定义,不写会后悔一辈子的题)](/img/b9/8cacd3d4ae1cf014654e0204cb3a62.png)


![[mqtt from getting started to improving series | 06] subscribe subscription workflow of mqtt3.1.1](/img/bf/9f8d8b2a73406970941fce33d3e754.png)


