| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3450 人关注过本帖
标题:求教: 虚方法 和 接口 有什么区别
只看楼主 加入收藏
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
结帖率:91.67%
收藏
已结贴  问题点数:20 回复次数:11 
求教: 虚方法 和 接口 有什么区别
请教老师大侠:

c# 的 虚方法 和 接口 有什么区别?

看了有关的解释,好像他们都是针对不同类(或者关系不密切的对象)去使用的。
所以不太明白他们在使用上有什么区别 或 是 如何选择他们去应用(或者说 什么情况用虚方法,什么情况下用接口)?

先拜谢老师!!

[ 本帖最后由 learnerok 于 2012-4-22 15:10 编辑 ]
搜索更多相关主题的帖子: 接口 如何 
2012-04-19 22:16
yhj8848
Rank: 1
等 级:新手上路
帖 子:7
专家分:7
注 册:2011-12-18
收藏
得分:7 
这是面向对像里的概念,接口里可以包含虚方法,但不提供现实该方法的实现代码,需要他的派生子类去实现,至于接口的应用嘛,它的作用主要是代码使代码的可拓展性和维护性以及它的最主要特性:多态性,这是我对接口听理解,多看看书吧
2012-04-21 09:30
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
收藏
得分:0 
谢谢 yhj8848 的回复!

但是 “c# 的 虚方法 和 接口 有什么区别?” 区别没有具体谈啊!

看了有关的解释,好像他们都是针对不同类(或者关系不密切的对象)去使用的。
所以不太明白他们在使用上有什么区别 或 是 如何选择他们去应用(或者说 什么情况用虚方法,什么情况下用接口)?
2012-04-22 14:23
leonjiE
Rank: 1
等 级:新手上路
帖 子:5
专家分:7
注 册:2012-3-26
收藏
得分:7 
这是一个继承和多继承的问题,接口可以多继承
2012-04-24 00:37
k_est
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2012-3-26
收藏
得分:7 
我的理解是接口跟类差不多,到接口实现了多继承,接口里面的成员也有一些要求,类在继承接口时,接口里面的方法必须实现,
而虚方法可以有实现体,接口里的方法在接口里面不能有实现部分。
还有它们与抽象类的区别,多看看书,试着使用它们。。。。
2012-04-24 07:25
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
收藏
得分:0 
什么情况用虚方法,什么情况下用接口呢?

比如说,你在中国吃饭就用筷子,在欧洲吃饭就用刀叉。

我不是问 筷子 和 刀叉的区别 和使用方法,而是问
什么情况下用筷子,什么情况下用刀叉。

哪位大侠 帮忙回答一下,在下万分感谢!


[ 本帖最后由 learnerok 于 2012-4-27 23:21 编辑 ]
2012-04-27 23:19
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
这个问题,真的有点让人不好回答,看你的程序设计需求吧。
不过就接口这个概念,估计你没有真正的掌握。什么是接口?类的public方法是不是接口?接口的要求是什么?
如果你能把这几个问题搞清楚,面象对象的程序思想你可能就前进了一大步。

我们都在路上。。。。。
2012-04-28 11:30
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
收藏
得分:0 
以下是引用hellovfp在2012-4-28 11:30:15的发言:

这个问题,真的有点让人不好回答,看你的程序设计需求吧。
不过就接口这个概念,估计你没有真正的掌握。什么是接口?类的public方法是不是接口?接口的要求是什么?
如果你能把这几个问题搞清楚,面象对象的程序思想你可能就前进了一大步。
感谢hellovfp老师,之前就从您获益匪浅啊 !!!


比如 员工类,它的子类有 普通员工,部门经理。
可以给员工类实现一个计算薪水的虚方法。
普通员工可以直接用这个方法,而部门经理类可以重写这个方法。

===================================

请教您,这里为什么不首选接口呢?


[ 本帖最后由 learnerok 于 2012-4-28 12:57 编辑 ]
2012-04-28 12:52
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
我也来谈谈我的理解。。。我觉得虚方法就是说 接口+默认的实现,比如你写一个表示图像的基类,他有一个叫draw的方法,但是具体怎么draw,不同的图像有不同的画法,所以这种情况下,就得用接口,因为图形必须会draw,所以要求子类实现draw,但怎么draw,基类无法提供一个好的默认的实现方法,如果有一个默认的实现方法,那就是虚方法。对于上面说得员工类,我觉得应该是用接口比较好点吧。。。。。
2012-04-28 13:29
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 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接口,让普通员工和部门经理类来继承这个接口并实现之,既可实现和虚方法相同的功能。采用哪种方式,看你自己怎么设计这个程序,就这是程序的灵活型,就象实现一样,实现也有多种不同的方式,采用哪种方式由程序自己决定。

接口的要求是什么呢?最小性和不可变性,最小性可能很好理解,就是不要在接口中定义过多的带歧义的与类无关的方法,不可变性是指接口定义好后,不能随意改变接口的名称和参数,否则实现要改的可不是只有一小部分,这点切记切记。

我们都在路上。。。。。
2012-04-28 13:45
快速回复:求教: 虚方法 和 接口 有什么区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020702 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved