c# 虚方法 抽象方法 接口
1. 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:
1 //抽象方法
2 public abstract class Animal
3 {
4 public abstract void Sleep();
5 public abstract void Eat();
6 }
2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:
1 public class Animal
2 {
3 public abstract void Sleep();
4 public abstract void Eat();
5 }
编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体 而虚方法可以
包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!如:
1 public abstract class Animal
2 {
3 public abstract void Sleep();
4 public abstract void Eat();
5 }
6
7 public class Cat : Animal
8 {
9 public override void Sleep()
10 {
11 Console.WriteLine( "Cat is sleeping" );
12 }
13 // we need implement Animal.Eat() here
14
15 }
编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',因为我们没有实现抽象类中所有抽象方法。
c#中的interface abstract 与 virtual
interface用来声明接口
1.只提供一些方法规约,不提供方法主体. 如:
1 public interface IPerson
2 {
3 void getName();//不包含方法主体
4 }
2.方法不能用public abstract等修饰,无字段变量,无构造函数。
3.方法可包含参数。 如
1 public interface IPerson
2 {
3 void getAge(string s);
4 }
一个例子(例1):
1 public interface IPerson
2 {
3 IPerson(); //错误
4 string name; //错误
5 public void getIDcard();//错误
6
7 void getName(); //right
8 void getAge(string s); //right
9 }
实现interface的类
1.与继承类的格式一致,如 public class Chinese:IPerson{}
2.必须实现 interface 中的各个方法
例2,继承例1
1 public class Chinese:IPerson
2 {
3 public Chinese(){} //添加构造
4 public void getName(){} //实现getName()
5 public void getAge(string s){} //实现getAge()
6 }
abstract声明抽象类、抽象方法
1.抽象方法所在类必须为抽象类
2.抽象类不能直接实例化,必须由其派生类实现。
3.抽象方法不包含方法主体,必须由派生类以override方式实现此方法,这点跟interface中的方法类似
如
1 public abstract class Book
2 {
3 public Book()
4 {
5 }
6
7 public abstract void getPrice(); //抽象方法,不含主体
8 public virtual void getName() //虚方法,可覆盖
9 {
10 Console.WriteLine("this is a test:virtual getName()");
11 }
12 public virtual void getContent() //虚方法,可覆盖
13 {
14 Console.WriteLine("this is a test:virtual getContent()");
15 }
16 public void getDate() //一般方法,若在派生类中重写,须使用new关键字
17 {
18 Console.WriteLine("this is a test: void getDate()");
19 }
20 }
21
22 public class JavaBook:Book
23 {
24 public override void getPrice() //实现抽象方法,必须实现
25 {
26 Console.WriteLine("this is a test:JavaBook override abstract getPrice()");
27 }
28 public override void getName() //覆盖原方法,不是必须的
29 {
30 Console.WriteLine("this is a test:JavaBook override virtual getName()");
31 }
32 }
测试如下:
1 public class test
2 {
3 public test()
4 {
5 JavaBook jbook=new JavaBook();
6 jbook.getPrice(); //将调用JavaBook中getPrice()
7 jbook.getName(); //将调用JavaBook中getName()
8 jbook.getContent(); //将调用Book中getContent()
9 jbook.getDate(); //将调用Book中getDate()
10
11 }
12 public static void Main()
13 {
14
15 test t=new test();
16 }
17 }
virtual标记方法为虚方法
1.可在派生类中以override覆盖此方法
2.不覆盖也可由对象调用
3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法
abstract 与virtual : 方法重写时都使用 override 关键字
interface中的方法和abstract方法都要求实现


浙公网安备 33010602011771号