C# 语言的高级应用
C# 語言的高級應用
1、屬性
例1:屬性概念的引入(問題)
public class Animal {public int Age;public double Weight;public bool Sex;public Animal(int age, double weight, bool sex){Age = age;Weight = weight;Sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }例2:問題的解決(Java語言解決該問題的方案)
public class Animal {private int _age;private double _weight;private readonly bool _sex;public int GetAge(){return _age;}public void SetAge(int value){_age = (value > 0) ? value : 0;}public double GetWeight(){return _weight;}public void SetWeight(double value){_weight = (value > 0) ? value : 0;}public bool GetSex(){return _sex;}public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;_sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", _age, _weight, _sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0},Weight:{1},Sex:{2}", al.GetAge(), al.GetWeight(), al.GetSex());al.SetAge(-1);al.SetWeight(-0.5);Console.WriteLine(al);} }例3:屬性的提出
public class Animal {private int _age;private double _weight;private readonly bool _sex;public int Age{get { return _age; }set { _age = (value > 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value > 0) ? value : 0; }}public bool Sex{get { return _sex; }}public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;_sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0}, Weight:{1}, Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }說明:C#在聲明data時就可以定義set、get方法。
- get:定義讀取操作。
- set:定義賦值操作,value表示傳入的參數值。
例4:屬性的簡化
public class Animal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value > 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value > 0) ? value : 0; }}public bool Sex { get; private set; }public Animal(int age, double weight, bool sex){_age = (age > 0) ? age : 0;_weight = (weight > 0) ? weight : 0;Sex = sex;}public void Eat(){Console.WriteLine("Animal Eat.");}public void Sleep(){Console.WriteLine("Animal Sleep.");}public override string ToString(){return string.Format("Animal Age:{0},Weight:{1},Sex:{2}", Age, Weight, Sex);} } class Program {static void Main(string[] args){Animal al = new Animal(1, 1.2, false);Console.WriteLine("Animal Age:{0}, Weight:{1}, Sex:{2}", al.Age, al.Weight, al.Sex);al.Age = -1;al.Weight = -0.5;Console.WriteLine(al);} }說明:屬性可以看作是對私有數據部分增加的一層隔離。
2、索引器
2.1 定義
是集合類中的一種特殊屬性,可使得集合類中的元素像數組元素一樣訪問。
2.2 語法結構
public 元素類型 this[int index] {get { ... }set { ... } }public 元素類型 this[string name] {get { ... }set { ... } }例5:利用索引器實現對集合類StudentSet中元素Student的訪問。
public class Student {private string _name;public string Name{get { return _name; }set{_name = string.IsNullOrEmpty(value)? "NULL": value;}}public long ID { get; set; }public Student(long id, string name){ID = id;_name = name;}public override string ToString(){return string.Format("ID:{0},Name:{1}", ID, Name);} } public class StudentSet {private readonly int _maxCount = 500;private readonly Student[] _stus;public int Count{get; private set;}public StudentSet(){Count = 0;_stus = new Student[_maxCount];}public void Add(Student stu){if (stu == null)throw new ArgumentNullException();if (Count == _maxCount)throw new IndexOutOfRangeException();_stus[Count] = stu;Count++;}public Student this[int index]{get{if (index < 0 || index > Count - 1)throw new IndexOutOfRangeException();return _stus[index];}set{if (index < 0 || index > Count - 1)throw new IndexOutOfRangeException();if (value == null)throw new ArgumentNullException();_stus[index] = value;}} } class Program {static void Main(string[] args){StudentSet stuSet = new StudentSet();stuSet.Add(new Student(10086, "張三"));stuSet.Add(new Student(95988, "李四"));stuSet[1].Name = string.Empty;Console.WriteLine(stuSet.Count); Console.WriteLine(stuSet[0]); Console.WriteLine(stuSet[1]); Console.WriteLine(stuSet[2]);//未處理的異常: System.IndexOutOfRangeException: 索引超出了數組界限。} }3、接口
3.1 概念
- 接口是類設計的藍圖,即只提供聲明而沒有實現。
- 接口不可以直接實例化對象(與抽象類相同)。
- C#允許一個類實現多個接口(注意與繼承的區別)。
- 接口就是包含一系列不被實現的方法,而把這些方法的實現交給繼承它的類。
3.2 表示
例6:根據類圖利用Dog實現IAnimal接口
public interface IAnimal {int Age { get; set; }double Weight { get; set; }void Eat();void Sleep(); } public class Dog : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Dog Eat");}public void Sleep(){Console.WriteLine("Dog Sleep");} } class Program {static void Main(string[] args){IAnimal al = new Dog();al.Age = 1;al.Weight = 2.5;Console.WriteLine("Dog:Age={0}, Weight={1}", al.Age, al.Weight);al.Eat();al.Sleep();} }例7:利用接口實現“飼養系統”
某飼養員(Raiser)在目前狀態下需要飼養三種動物:狗(Dog)、鳥(Bird)和魚(Fish),該三種動物只需要讓其睡覺(Sleep)和吃飯(Eat)即可。請設計該飼養系統,要求滿足軟件設計的“開閉原則”。
方案一:(在抽象類部分已經給出)
方案二:
public interface IAnimal {int Age { get; set; }double Weight { get; set; }void Eat();void Sleep(); } public class Bird : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Bird Eat.");}public void Sleep(){Console.WriteLine("Bird Sleep.");}public void Fly(){Console.WriteLine("Bird Fly.");} } public class Dog : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Dog Eat.");}public void Sleep(){Console.WriteLine("Dog Sleep.");}public void Run(){Console.WriteLine("Dog Run.");} } public class Fish : IAnimal {private int _age;private double _weight;public int Age{get { return _age; }set { _age = (value >= 0) ? value : 0; }}public double Weight{get { return _weight; }set { _weight = (value >= 0) ? value : 0; }}public void Eat(){Console.WriteLine("Fish Eat.");}public void Sleep(){Console.WriteLine("Fish Sleep.");}public void Swim(){Console.WriteLine("Fish Swim.");} } public class Raiser {public void Raise(IAnimal al){al.Eat();al.Sleep();} } class Program {static void Main(string[] args){Raiser rsr = new Raiser();rsr.Raise(new Dog());rsr.Raise(new Bird());rsr.Raise(new Fish());} }3.3 接口(interface)與抽象類(abstract class)
(1)相同點:
- 接口與抽象類都不可以直接實例化對象。
(2)不同點:
- 抽象類中的數據和操作必須有限制修飾符,而接口中的數據和操作不可以有限制修飾符。
- 抽象類中可以有帶實現體的方法(非abstract方法),而接口只能有方法的聲明。
- 抽象類在子類中通過override關鍵字覆寫抽象方法,而接口被子類直接實現。
例8:一個類可以實現多個接口,但要注意多個接口中有重名方法的處理。
方式一:
public interface IHighWayWorker {void HighWayOperation();void Build(); } public interface IRailWayWorker {void RailWayOperation();void Build(); } public class Worker : IRailWayWorker, IHighWayWorker {public void HighWayOperation(){Console.WriteLine("HighWayOperation.");}public void RailWayOperation(){Console.WriteLine("RailWayOperation");}public void Build(){Console.WriteLine("HighWay,RailWay,Build.");} } class Program {static void Main(string[] args){Worker wr = new Worker();wr.Build(); // HighWay,RailWay,Build.IHighWayWorker hwr = new Worker();hwr.Build(); // HighWay,RailWay,Build.hwr.HighWayOperation(); // HighWayOperation.IRailWayWorker rwr = new Worker();rwr.Build(); // HighWay,RailWay,Build.rwr.RailWayOperation();// RailWayOperation} }方式二:
public interface IHighWayWorker {void HighWayOperation();void Build(); } public interface IRailWayWorker {void RailWayOperation();void Build(); } public class Worker : IHighWayWorker, IRailWayWorker {public void HighWayOperation(){Console.WriteLine("HighWayOperation.");}public void RailWayOperation(){Console.WriteLine("RailWayOperation");}void IHighWayWorker.Build(){Console.WriteLine("HighWay Build.");}void IRailWayWorker.Build(){Console.WriteLine("RailWay Build.");}// 注意:void IHighWayWorker.Build()和void IRailWayWorker.Build()// 前面不能夠加限制修飾符。 } class Program {static void Main(string[] args){Worker wr = new Worker();//wr.Build(); 該語句錯誤IHighWayWorker hwr = new Worker();hwr.Build();//HighWay Build.hwr.HighWayOperation();//HighWayOperation.IRailWayWorker rwr = new Worker();rwr.Build();//RailWay Build.rwr.RailWayOperation();//RailWayOperation} }4、泛型
例9:存儲int數據類型的集合及操作。
public class IntSet {private readonly int _maxSize;private readonly int[] _set;public IntSet(){_maxSize = 100;_set = new int[_maxSize];//...}public void Insert(int k, int x){//...._set[k] = x;}public int Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){IntSet iSet = new IntSet();iSet.Insert(0, 123);int i = iSet.Locate(0);Console.WriteLine(i); // 123} }例10:存儲string數據類型的集合及操作。
public class StringSet {private readonly int _maxSize;private readonly string[] _set;public StringSet(){_maxSize = 100;_set = new string[_maxSize];//...}public void Insert(int k, string x){//...._set[k] = x;}public string Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){StringSet strSet = new StringSet();strSet.Insert(0, "abc");string j = strSet.Locate(0);Console.WriteLine(j); // abc} }例11:利用object類存儲通用數據類型的集合及操作。
public class GSet {private readonly int maxSize;private readonly object[] _set;public GSet(){maxSize = 100;_set = new object[maxSize];//...}public void Insert(int k, object x){//...._set[k] = x;}public object Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet gSet1 = new GSet();gSet1.Insert(0, 123);int k1 = (int)gSet1.Locate(0);Console.WriteLine(k1); // 123GSet gSet2 = new GSet();gSet2.Insert(0, "abc");string k2 = (string)gSet2.Locate(0);Console.WriteLine(k2); // abcGSet gSet3 = new GSet();gSet3.Insert(0, 123);gSet3.Insert(1, "abc");//編譯時可以通過,運行時出現異常。int k3 = (int)gSet3.Locate(1); //這樣使用存在類型安全問題。Console.WriteLine(k3);// 未處理的異常: System.InvalidCastException: 指定的轉換無效。} }泛型定義:即參數化類型。
在編譯時用一個具體類型代替該參數類型,可定義類型安全的類而不影響工作效率。
例12:利用泛型T存儲通用數據類型的集合及操作。
public class GSet<T> {private readonly int _maxSize;private readonly T[] _set;public GSet(){_maxSize = 100;_set = new T[_maxSize];//...}public void Insert(int k, T x){//...._set[k] = x;}public T Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet<int> gSet1 = new GSet<int>();gSet1.Insert(0, 123);int k1 = gSet1.Locate(0);Console.WriteLine(k1); // 123GSet<string> gSet2 = new GSet<string>();gSet2.Insert(0, "abc");string k2 = gSet2.Locate(0);Console.WriteLine(k2); // abc} }我們把T稱為類型參數,當然我們也可以對T進行約束。
例13:為類型參數T增加約束,比如T只能是值類型。
public class GSet<T> where T : struct {private readonly int _maxSize;private readonly T[] _set;public GSet(){_maxSize = 100;_set = new T[_maxSize];//...}public void Insert(int k, T x){//...._set[k] = x;}public T Locate(int k){//...return _set[k];} } class Program {static void Main(string[] args){GSet<int> gSet1 = new GSet<int>();gSet1.Insert(0, 123);int k1 = gSet1.Locate(0);Console.WriteLine(k1); // 123// GSet<string> gSet2 = new GSet<string>(); // 編譯錯誤// 錯誤 CS0453 類型“string”必須是不可以為 null 值的類型,// 才能用作泛型類型或方法“GSet < T >”中的參數“T” } }有關泛型約束可以查看以下圖文:
- 技術圖文:C#語言中的泛型 I
- 技術圖文:C#語言中的泛型 II
5、類與類之間的關系
public class Oxygen {//... } public class Water {//... } public abstract class Animal {public int Age;public double Weight;public abstract void Eat();public abstract void Sleep();public abstract void Breed();public abstract void Metabolism(Oxygen o2, Water water); } public class Bird : Animal {public string Feather;public void Fly(){//...}public void Egg(){//...}public override void Eat(){//...}public override void Sleep(){//...}public override void Breed(){//...}public override void Metabolism(Oxygen o2, Water water){//...} } public class Penguin : Bird {//... } public class Goose : Bird {//... } public class Duck : Bird {//... } public class Climate {//... } public class Penguin : Bird {private Climate _climate;//... } public interface ILanguage {void Speak(); } public class DonaldDuck : Duck, ILanguage {public void Speak(){//...}//... }總結
以上是生活随笔為你收集整理的C# 语言的高级应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电力英语计算机题库,历年国家电网计算机考
- 下一篇: c# char unsigned_dll