抽象类: (abstract)
不能实例化。
可以在抽象类中定义抽象方法,以供派生类写具体方法。
派生类也可以保留抽象方法,但该类必须为抽象类。
也可以在抽象类中写非抽象方法。
例子:
抽象类
public abstract class AbstractClass
{
public abstract string GetName(string Name);
public string GetNameByID(string Name)
{
return Name;
}
}
派生类
public class UserClass:AbstractClass
{
public override string GetName(string Name)
{
return Name + "nihao.";
}
}
虚方法: (virtual)
通过在基类中定义虚方法(virtual),在子类中,可以通过override进行派生重写。
例子
基类
public class VirtualClass
{
public virtual string GetName(string Name)
{
return Name;
}
}
子类
public class UserClass2:VirtualClass
{
public override string GetName(string Name)
{
//return base.GetName(Name);
return "Hello." + Name;
}
}
接口: (interface)
接口即契约。用于规定一种规则由大家遵守。允许多继承.而继承类只允许单继承.
定义接口
public interface UserInterface
{
void UserLogin(string UserName,string Password);
bool Login(out string exInfo);
}
使用接口
public class UserClass : UserInterface
{
#region UserInterface 成员
public void UserLogin(string UserName, string Password)
{
throw new Exception("The method or operation is not implemented.");
}
public bool Login(out string exInfo)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
说明:
多态是面向对象编程的三大特性之一。
接口和虚函数是多态的表现形式。
在需要多态的情境下:
如果类中方法可以确定下来,而以后可能改变方法的用途,使用虚函数较好。
如果类中方法不确定,用途也不确定。只能确定格式,那么使用接口,以方便需要的类进行继承。进行扩展。
抽象类不能多态。抽象类是用于在开发初期不清楚或者不确定后续方法细则的情况下使用。
虚函数是一个已经定义好的函数,可以直接使用。
接口只是定义契约,没有具体实现。必须继承后实现才能使用。
接口本质上仍然被标记为.class,同时提供abstract virtual 方法的Method,因此接口其实本质上可以看作是一个定义了抽象方法的类,该类仅提供了方法的定义,而没有方法的实现,其功能由接口的实现类来完成。
虚函数可以在抽象类和非抽象类中定义,而抽象方法必须在抽象类中定义。
抽象类中的非抽象方法,在派生的类中,不能重写。
还不明白请看下面:
interface用来声明接口
1.只提供一些方法规约,不提供方法主体
如: public interface IPerson
...{
void getName(); //不包含方法主体
}
2.方法不能用public abstract等修饰,无字段变量,无构造函数。
3.方法可包含参数
如: public interface IPerson
...{
void getAge(string s);
}
如下,举一个例子(例1): public interface IPerson
...{
IPerson(); //错误
string name; //错误
public void getIDcard();//错误
void getName(); //right
void getAge(string s); //right
}
实现interface的类
1.与继承类的格式一致,如 public class Chinese:IPerson{}
2.必须实现interface中的各个方法
例2,继承例1 public class Chinese:IPerson
...{
public Chinese()...{} //添加构造
public void getName()...{} //实现getName()
public void getAge(string s)...{} //实现getAge()
}
abstract声明抽象类、抽象方法
1.抽象方法所在类必须为抽象类
2.抽象类不能直接实例化,必须由其派生类实现。
3.抽象方法不包含方法主体,必须由派生类以override方式实现此方法,这点跟interface中的方法类似
如: public abstract class Book
...{
public Book()
...{
}
public abstract void getPrice(); //抽象方法,不含主体
public virtual void getName() //虚方法,可覆盖
...{
Console.WriteLine("this is a test:virtual getName()");
}
public virtual void getContent() //虚方法,可覆盖
...{
Console.WriteLine("this is a test:virtual getContent()");
}
public void getDate() //一般方法,若在派生类中重写,须使用new关键字
...{
Console.WriteLine("this is a test: void getDate()");
}
}
public class JavaBook:Book
...{
public override void getPrice() //实现抽象方法,必须实现
...{
Console.WriteLine("this is a test:JavaBook override abstract getPrice()");
}
public override void getName() //覆盖原方法,不是必须的
...{
Console.WriteLine("this is a test:JavaBook override virtual getName()");
}
}
测试如下: public class test
...{
public test()
...{
JavaBook jbook=new JavaBook();
jbook.getPrice(); //将调用JavaBook中getPrice()
jbook.getName(); //将调用JavaBook中getName()
jbook.getContent(); //将调用Book中getContent()
jbook.getDate(); //将调用Book中getDate()
}
public static void Main()
...{
test t=new test();
}
}
virtual标记方法为虚方法
1.可在派生类中以override覆盖此方法
2.不覆盖也可由对象调用
3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法
abstract与virtual: 方法重写时都使用 override 关键字
interface中的方法和abstract方法都要求实现
抽象类、虚函数、接口、多态 概念与关系的理解
最新推荐文章于 2024-10-06 16:28:11 发布
new override 关于