会员
周边
众包
新闻
博问
闪存
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
韩星
学习交流.Net、Java、PHP、Linux、Android相关知识
技术不是工作的全部,工作不是生活的全部,用技术改变生活!
博客园
首页
新随笔
联系
订阅
管理
c#中的interface abstract与virtual
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方法都要求实现
作者Blog:http:
//
blog.csdn.net/yadier/
abstract
(C# 参考)
abstract
修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用
abstract
修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
在此例中,类 Square 必须提供 Area 的实现,因为它派生自 ShapesClass:
复制代码
abstract
class
ShapesClass
{
abstract
public
int
Area();
}
class
Square : ShapesClass
{
int
x, y;
//
Not providing an Area method results
//
in a compile-time error.
public
override
int
Area()
{
return
x
*
y;
}
}
有关抽象类的更多信息,请参见抽象类、密封类及类成员(C# 编程指南)。
备注
抽象类具有以下特性:
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用
sealed
(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
在方法或属性声明中使用
abstract
修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
抽象方法是隐式的虚方法。
只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 (
{ }
)。例如:
复制代码
public
abstract
void
MyMethod();
实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。
在抽象方法声明中使用
static
或
virtual
修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
在静态属性上使用
abstract
修饰符是错误的。
在派生类中,通过包括使用
override
修饰符的属性声明,可以重写抽象的继承属性。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。例如:
复制代码
interface
I
{
void
M();
}
abstract
class
C: I
{
public
abstract
void
M();
}
示例
在本例中,DerivedClass 类是从抽象类 BaseClass 派生的。抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 X 和 Y。
复制代码
//
abstract_keyword.cs
//
Abstract Classes
using
System;
abstract
class
BaseClass
//
Abstract class
{
protected
int
_x
=
100
;
protected
int
_y
=
150
;
public
abstract
void
AbstractMethod();
//
Abstract method
public
abstract
int
X
{
get
; }
public
abstract
int
Y
{
get
; }
}
class
DerivedClass : BaseClass
{
public
override
void
AbstractMethod()
{
_x
++
;
_y
++
;
}
public
override
int
X
//
overriding property
{
get
{
return
_x
+
10
;
}
}
public
override
int
Y
//
overriding property
{
get
{
return
_y
+
10
;
}
}
static
void
Main()
{
DerivedClass o
=
new
DerivedClass();
o.AbstractMethod();
Console.WriteLine(
"
x = {0}, y = {1}
"
, o.X, o.Y);
}
}
输出
x
=
111
, y
=
161
注释
在上面的示例中,如果试图通过使用下面的语句将抽象类实例化:
复制代码
BaseClass bc
=
new
BaseClass();
//
Error
posted @
2007-09-11 15:03
wenanry
阅读(
426
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告