多种语言--override实现对比(C++,Java,Pascal)

这也许用JAVA确实不好说,不如用PASCAL说明要好理解一些(下面的是在DELPHI7中写的):

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
A = class
public
procedure Method1;virtual;
procedure Method2;overload;virtual;
procedure Method2(StrParam:String);overload;virtual;
end;
B = class(A)
public
procedure Method1;overload;override;
procedure Method1(StrParam:String);overload;//这里不能用override;因为Method1(StrParam:String);在A中找不到
procedure Method2;overload;override;
procedure Method2(StrParam:String);overload;override;
//这里可以有override;因为Method2(StrParam:String);在A中可以找到,
//没有则属于'覆盖',即在方法中不会有inherited,当然会收到一个警告:
//[Warning] Unit1.pas(19): Method 'Method2' hides virtual method of base type 'A'
}
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ A }

procedure A.Method1;
begin
ShowMessage('A:Mehtod1(No Parameter)');
end;

procedure A.Method2;
begin
ShowMessage('A:Mehtod2(No Parameter)');

end;

procedure A.Method2(StrParam: String);
begin
ShowMessage('A:Mehtod2(String Parameter)');

end;

{ B }

procedure B.Method1;
begin
inherited; //super.Mehtod1;
ShowMessage('B:Mehtod1(No Parameter)');
end;

procedure B.Method1(StrParam: String);
begin
inherited Method1;//这里仍然可以强制使用A中的Method1;super.Mehtod1;这与B.Method2(StrParam: String);的inherited不同
ShowMessage('B:Mehtod1(String Parameter)');

end;

procedure TForm1.Button1Click(Sender: TObject);
var
temp:B;
begin
temp:=B.Create;
temp.Method1();
temp.Method1('riss');
temp.Method2;
temp.Method2('riss');
temp.Free;
end;

procedure B.Method2;
begin
inherited;//super.Mehtod2;
ShowMessage('B:Mehtod2(No Parameter)');

end;

procedure B.Method2(StrParam: String);
begin
inherited;//super.Mehtod2(StrParam);
ShowMessage('B:Mehtod2(String Parameter)');

end;

end.

啰嗦了点,将就看看吧!PASCAL做为一门教学语言还真的不错!哈哈!
------------------------------------------------------------------------------------------------------------------------------------------
与之对应的C++代码较为难看些,不好理解


代码
[code] // ControlTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std ;

class A
{
public:
virtual void Method1(void);
virtual void Method2(void);
virtual void Method2(string StrParam);
};
class B:public A
{

public:
void Method1(void);
void Method1(string StrParam);
void Method2(void);
void Method2(string StrParam);
};
int _tmain(int argc, _TCHAR* argv[])
{
int i;

A* a = new A();
a->Method1();
a->Method2();
a->Method2("riss");

B* b = new B();
b->Method1();
b->Method1("riss");
b->Method2();
b->Method2("riss");

cin >>i;
delete a;
delete b;
return 0;
}

void A::Method1(void)
{
cout << "A:Method1(No Parameter)"<<endl;
}

void A::Method2(void)
{
cout << "A:Method2(No Parameter)"<<endl;
}

void A::Method2(string StrParam)
{
cout << "A:Method2(String Parameter)"<<endl;
}

void B::Method1(void)
{
((A)* this).Method1();
cout << "B:Method1(No Parameter)"<<endl;

}

void B::Method1(string StrParam)
{
((A)* this).Method1();
cout << "B:Method1(Str Parameter)"<<endl;
}

void B::Method2(void)
{
((A)* this).Method1();
cout << "B:Method2(No Parameter)"<<endl;
}

void B::Method2(string StrParam)
{
((A)* this).Method2(StrParam);
cout << "B:Method2(String Parameter)"<<endl;
}
[/code]

C++的语法忘记的差不多了,上面的得出结果差不多,其他的另当别论(比如说,代码的风格,质量等等)
------------------------------------------------------------------------------------------------------------------------------------------
最后看看JAVA的实现,比C++要稍好一点,但还是没有DELPHI来的直观.
但从另一个角度来看,我们这里所讨论的继承,并不能说关于JAVA的继承,这是面方对象中的继承啊!
我还是找一本对深讨面向对象方面的书翻翻再来和大家继续哦!(温故而知新)
C#的和DELPHI+JAVA的写法差不多(不给出了)


代码
[code] package com;

class A{
void Method1(){
System.out.println("A:Mehtod1(No Parameter)");
}
void Method2(){
System.out.println("A:Mehtod2(No Parameter)");
}
void Method2(String strParam){
System.out.println("A:Mehtod2(String Parameter)");
}
}

class B extends A{
void Method1(){
super.Method1();
System.out.println("B:Mehtod1(No Parameter)");
}
void Method1(String strParam){
super.Method1();
System.out.println("B:Mehtod1(No Parameter)");
}
void Method2(){
super.Method2();
System.out.println("B:Mehtod2(No Parameter)");
}
void Method2(String strParam){
super.Method2(strParam);
System.out.println("B:Mehtod2(String Parameter)");
}

}
public class BBS_Override {

/**
* <p>******************************************************************************</p>
* <p>Method Name:main</p>
*
* <p>Function:</p>
*
* <p>Description:</p>
* <p></p>
* @param args
* <p>******************************************************************************</p>
*/

public static void main(String[] args) {
A a=new A();
a.Method1();
a.Method2();
a.Method2("riss");

B b=new B();
b.Method1();
b.Method1("riss");
b.Method2();
b.Method2("riss");
}

}
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值