代码改变世界

抽象方法

2010-04-26 21:55  三皮开发时  阅读(297)  评论(0)    收藏  举报

1.抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。(一定要被实例化来覆盖抽象方法的)

//抽象方法
public abstract class Animal
{
    
public abstract void Sleep();
    
public abstract void Eat();
}


2.其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如果

public class Animal
{
    
public abstract void Sleep();
    
public abstract void Eat();
}

就会报编译错误...

 

 

3.以下是C#语法基础

 

3.1.C#类和接口的区别

接口是负责功能的定义,项目中通过接口 来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!
在 类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一 个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专 业化。
但接口是一个行为的规范,里面的所有东西都是抽象 的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口
PS:接口 除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就 是设计
原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与 扩 展是开放的,我们可以另写一个接口
的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不 能够”是指在规范原则上不应该这么做!  

3.2.抽象类和接口的区别
答:
抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义
抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性
分析对象,提炼内部共性形成抽象类,用 以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口

3.3. C#语言中,值类型和引用类型有何不同?
答:
    值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
  值类型变量直接 把 变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不 相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存 储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个 堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变 量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈 中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

3.4.结构和类的区别
答:
   1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。
  2) 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。
  3) 一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。

3.5.抽象方法和虚方法的 区别抽象方法使 用abstract关键字 public abstract bool Withdraw(…);抽象方法是必须被派生类覆写的方法。抽 象方法是可以看成是没有实现体的虚方法如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法虚方法使 用virtual关键字 public virtual bool Withdraw(…);调用虚方法,运行时将确定调用对象是什么类的实例, 并调用适当的覆写的方法。虚方法可以有实现体虚拟方法和抽象方法有什么区别?抽象方法只有声明没有实现,需要在子类中实 现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现虚拟方法有实现代码抽象方法则没有,并 且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类抽象方法是虚拟方法的一种抽象方法没有实现,它的存在只是为派生类 统一接口;派生类应该实现这个方法如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为抽象方法。抽 象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现

 

4. 虚方法和抽象方法

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

4.1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:

//抽象方法
public abstract class Animal
{
    
public abstract void Sleep();
    
public abstract void Eat();
}

//虚方法
public class Animal
{
    
public virtual void Sleep(){}
    
public virtual void Eat(){}
}

4.2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:
public class Animal
{
    
public abstract void Sleep();
    
public abstract void Eat();
}

编译器会报错:
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'

4.3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。如:

public abstract class Animal
{
    
public abstract void Sleep();
    
public abstract void Eat();
}

public class Cat : Animal
{
    
public override void Sleep()
    {
        Console.WriteLine( 
"Cat is sleeping" );
    }
    
// we need implement Animal.Eat() here

}