回复 8楼 learnerok
这里偶先讲一下接口有哪些不同的表现形式:还是从C开始,希望你的C语言没有丢太多。
这是一个栈的C程序实现:
STACK.h 头文件
#ifndef _STACK_HEADER
struct StackRecord;
typedef struct StackRecord *Stack;
int IsEmpty(Stack S);
int IsFull(Stack S);
Stack CreateStack(int MaxElements);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
ElementType TopAndPop(Stack S);
#endif
----------------------------------
下面是实现文件:stack_impl.c
* Stack implementation is a dynamically allocated array */
#define EmptyTOS
(-1)
#define MinStackSize
(5)
typedef int ElementType;
struct StackRecord
{
int Capactity;
int TopOfStack;
ElementType *Array;
};
#include "Stack.h"
#include <stdlib.h>
Stack
CreateStack(int MaxElements)
{
Stack S;
if(MaxElements < MinStackSize)
Error("Stack size is too small");
S = (Stack) malloc(sizeof(struct StackRecord));
if(S == NULL)
FatalError("Out of sapce!!!");
S->Array = malloc( sizeof(ElementType) * MaxElements );
if( S->Array == NULL)
FatalError("Out of sapce!!!");
S->Capactity = MaxElements;
MakeEmpty( S );
return S;
}
void
DisposeStack( Stack S)
{
if( S != NULL )
{
free( S->Array );
free( S );
}
}
int
IsEmpty( Stack S )
{
return S->TopOfStack == EmptyTOS;
}
void
MakeEmpty( Stack S)
{
S->TopOfStack = EmptyTOS;
}
void
Push(ElementType X, Stack S)
{
if( IsFull(S) )
Error( "Full stack" );
else
S->Array[ ++S->TopOfStack ] = X;
}
void
Pop( Stack S)
{
if(IsEmpty(S) )
Error("Empty Stack");
else
S->TopOfStack--;
}
ElementType
TopAndPop(Stack S)
{
if( !IsEmpty(S) )
return S->Array[ S->TopOfStack-- ];
Error("Empty stack");
return 0;
}
C语言里那么什么是接口?就是STACK.h头文件中申明的那些函数原型,比如说栈判空函数,int IsEmpty(Stack S);那么我们看到这段代码,知道里面是如何实现的么?不知道,因为只有申明。这就是接口。
既规定了函数要做什么,至于怎么做?不是接口该管的事,这是程序设计者应该思考的事。那么与接口对应的就是
实现,具体代码的实现,既这里的实现代码stack_impl.c中的:
int
IsEmpty( Stack S )
{
return S->TopOfStack == EmptyTOS;
}
如果实现函数体里没有代码,比如说没有return S->TopOfStack == EmptyTOS;这句,我们讲,它就是一个空实现,但空实现还是实现了接口的定义,一般是可以通过编译的。
接口在C#类中如何表现?两种方式,一种通过public属性指明的成员函数,或称为public方法,是可以被外部访问的方法,private方法不是公用接口的表现形式。第二种就是通过关健字Interface定义的接口,和上面的C一样,接口只管定义,接口制定者不管实现,实现可以分给很多人来完成,这就是多人协作完成大型软件的基础。并不是说只有Interface才算是接口。
那么我们来说说你举的这个例子:
员工类,它的子类有 普通员工,部门经理。
可以给员工类实现一个计算薪水的虚方法。
普通员工可以直接用这个方法,而部门经理类可以重写这个方法。
计算薪水如果定义成虚方法,virtual关健字的,但还是放在public下面才能访问,所以该虚方法也是接口,并不违反上述第一条。定义了普通员工, 部分经理应该实现的计算薪水的方法,怎么实现就是各种类应该完成的功能。那么可不可以用接口Interface来作呢?一样可以,不是不能选这种方式,这恰恰是C#提倡的方式。我们可以定义计算薪水的Interface接口,让普通员工和部门经理类来继承这个接口并实现之,既可实现和虚方法相同的功能。采用哪种方式,看你自己怎么设计这个程序,就这是程序的灵活型,就象实现一样,实现也有多种不同的方式,采用哪种方式由程序自己决定。
接口的要求是什么呢?
最小性和不可变性,最小性可能很好理解,就是不要在接口中定义过多的带歧义的与类无关的方法,不可变性是指接口定义好后,不能随意改变接口的名称和参数,否则实现要改的可不是只有一小部分,这点切记切记。