接口、抽象、迭代器跟java的说法差不多,所以只作简单的解释,主要通过实例简单了解用法。
接口:通过它可以实现多重继承的功能。接口可以包含属性、方法、索引器和事件,但只可以对其进行定义而不能赋值。
简单声明的接口:
interface IPeople{ string Name{get;set;} void show(); }
使用Program类实现接口:
class Program : IPeople{ string name=""; public string Name{get{return name;} set{name=value;}} public show(){Console.Write("Name:"+Name);} }
主程序,使用实例化Program对象:
Program pro = new Program();//实例化Program对象 IPeople ip = pro;//使用派生类对象实例化接口 ip.Name = "hello";//为派生类中的Name属性赋值 ip.show();//调用派生类中方法显示属性值
上例通过实例化的接口对象访问派生类中的属性和方法。另外,接口还可以多重继承,使用时通过( ,)分隔:
interface IPeople{ string Name{get;set;} } interface IMan : IPeople{ void sex(); } class Program :IPeople,IMan{ public void sex(){Console.Write("..."); } } //调用时: IMan man = pro; man.sex();
显式调用接口成员(类实现两个接口,两个接口有相同的成员时,作为区分使用):
interface ICal1{ int Add(); } interface ICal2{ int Add(); } class Calculate : ICal1,ICal2{ int ICal1.Add(){ //显式接口成员实现 int x = 10; int y = 20; return x+y; } int ICal2.Add(){ int x = 10; int y = 20; int z = 30; return x+y+z; } } //调用时 Calculate cal = new Calculate(); ICal1 cal1 = cal; Console.WriteLine(cal.Add());//同理可以使用接口继承类ICal2的对象实例化接口
*********
抽象类和抽象方法:
只要有一个方法声明为抽象方法,这个类也必须被声明为抽象类。抽象类不能被密封。
抽象类声明:
public abstract class Test{ public int i; public void method(); public abstract void abdMethod();//抽象方法 }
抽象类和抽象方法的使用:
public abstract class People{ private string name=""; public string Name{ get{return name;} set{name = value;} } public abstract void show();//抽象方法 } public class One :People{ //重写抽象类中输出信息的方法 public override void show(){Console.Write("...");} } //实现 One one = new One();//实例化派生类 People p = one;//使用派生类对象实例化抽象类 p.Name = "hello";//使用抽象类对象访问抽象类中的姓名 p.show();//使用抽象类对象调用派生类中的方法
**********
密封类和密封方法:(为避免滥用继承而提出来的)
密封类可以限制扩展性,如果密封了某个类,则其他类不能从该类中继承(所以抽象类不能被密封);同理,密封的成员也如此。
密封类的声明:
public sealed class SealedTest{}
密封方法:
密封方法只能用于对基类的虚方法进行实现,并提供具体的实现,所以,声明密封方法时,sealed修饰符和override修饰符同时使用。
public class Base{ public virtual void show(){//定义一个虚方法 Console.WriteLine("这是基类中的虚方法"); } } public sealed class Derive:Base{//从基类派生一个密封子类 //密封并重写基类中的虚方法show() public sealed override void show(){ base.show();//调用基类的虚方法 Console.WriteLine("这是密封类中重写后的方法"); } }
密封类和密封方法的使用:
public class People{ public virtual void show(){}//虚方法 } public sealed class Student{ private string name =""; public string Name{get{return name;} set{name = value;}} //密封并重写基类中的show() public sealed override void show(){ Console.WriteLine("NAME: "+Name); } } //调用 Student stu = new Student();//实例化密封类对象 stu.Name = "hello"; stu.show();
迭代器:
用于返回相同类型的值的有序序列的一段代码。迭代器代码使用yield return 语句依次返回每个元素,yield break语句将终止迭代。返回类型必须是IEnumerable或IEnumerator中的一种。
创建迭代器:
public class Banks : IEnumerable { string[] arr = { "item1", "item2", "item3", "item4" }; public IEnumerator GetEnumerator() { for (int i = 0; i < arr.Length; i++) { yield return arr[i]; } } } //调用 Banks banks = new Banks(); foreach (string str in banks) { richTextBox1.Text += str + "\n"; }
**********
分部类:(直接举例比较容易理解)
partial class Part{//分部类第一部分 public int add(int a, int b){return a+b;} } partial class Part{//分部类第二部分 public int sub(int a, int b){return a-b;} } //调用时。可以知道分部类其实各部分就是组成一个类 Part part = new Part(); part.add(1,2);part.sub(5,3);
********
泛型(和java的类似,所以只是举例):
public class Manager{ public static int Mana<T>(T[] items, T item){//创建泛型方法 } } //调用泛型方法 int i = Manager.Mana<int>(new int[]{1,2} , 2);
实例——利用接口实现选择不同的内容
interface ISelect{ void Speak(string str); } class Chinese :ISelect{ public void Speak("....."); } class Foreign :ISelect{ public void Speak("....."); }
实例——通过重写抽象方法实现多态性
class Animal{ public string Run(){return "can run!";} public abstract string Sound();//声明抽象方法 } class Dog : Animal{ public override string Sound(){ return "Wang!"; } } //该类通过多态性输出动物的相关行为信息 public static class AnimalClass{ public static string AnimalSound(Animal an){ return an.Sound(); } } //在程序中调用时 Dog dog = new Dog(); AnimalClass.AnimalSound(dog);
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。