`
riss
  • 浏览: 14938 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

多种语言--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++代码较为难看些,不好理解


代码
 // 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;
}


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


代码
 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");
	}

}
分享到:
评论

相关推荐

    Android Studio3.0开发JNI流程------C++调用Java以及Java调用C++,C++/Java互相调用

    在Android应用开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。JNI在Android系统中扮演着重要的角色,特别是在需要高效计算或者利用硬件特性时,如游戏开发、图像处理和...

    opreator-override.zip_override+c++_运算符重载

    在C++编程语言中,运算符重载(Operator Overloading)是一种重要的特性,它允许我们为自定义数据类型赋予特定的运算符行为。这使得我们可以使用熟悉的运算符(如+,-,*,/等)来操作我们自己定义的对象,从而提高...

    method-override:覆盖HTTP动词

    $ npm install method-override API 注意在需要了解请求方法的任何模块之前使用此模块非常重要(例如,必须在csurf模块之前使用它)。 methodOverride(getter,选项) 创建一个新的中间件函数,以新值覆盖req....

    覆盖(Override)---马克-to-win Java视频

    覆盖 Override 马克-to-win Java视频的能详细的介绍

    覆盖(Override)2---马克-to-win java视频

    覆盖 Override 马克-to-win java视频的详细描述介绍

    C++与Java语言对比

    C++通过虚函数(virtual)和纯虚函数(pure virtual)实现多态,而Java通过方法重写(Override)和抽象类(abstract class)及接口来实现。Java的多态性更为严格,所有非私有的方法默认都是虚方法,而C++则需要明确...

    Override,Overload,Overwrite的区别---马克-to-win Java视频

    Override Overload Overwrite 马克-to-win Java视频

    c++ java 抽象工厂模式代码

    在C++和Java这两种编程语言中,抽象工厂模式的应用相当广泛,特别是在需要跨平台或者需要一组相关的对象协同工作时。 首先,我们来看看C++中的抽象工厂模式。在C++中,我们通常通过定义接口(纯虚函数)来实现抽象...

    brpc-java是baidurpc的java版本实现

    brpc-java是百度内部的RPC(Remote Procedure Call)框架在Java语言上的实现,旨在为Java开发者提供高效、可靠的分布式服务调用能力。RPC框架的核心目标是简化分布式系统中服务间的通信,使得调用远程服务如同调用...

    基于c++实现的GRPC服务端demo

    在本文中,我们将深入探讨如何使用 C++ 实现一个简单的 gRPC 服务端 demo。首先,我们需要了解 gRPC 的核心概念和工作原理。 1. **gRPC 基本概念** - **RPC**:远程过程调用,允许一个程序调用另一个位于不同地址...

    se-geo-override-crx插件

    se-geo-override-crx插件的工作原理可能是通过模拟地理位置数据或修改浏览器的定位接口来实现定位功能的恢复。它可能包含了一些特定的适配逻辑,以适应Panasonic Toughbook的硬件和操作系统环境。当安装此插件后,...

    venia-ui-override-resolver

    安装此套件 yarn add @fooman/venia-ui-override-resolver或者npm i @fooman/venia-ui-override-resolver用法将具有相同文件路径的单个文件从node_modules/@magento/venia-ui/lib复制到src/overrides/venia-ui 。...

    C++、Java和C_的语法比较.doc

    这里主要聚焦于C++与C#的对比,并适当提及Java的相关特性,以帮助读者更好地理解这些语言之间的区别。 ### 一、继承 **C++**: 支持多继承,即一个类可以从多个基类继承属性和方法。 **C#**: 不支持多继承,一个类...

    magento2-copy-theme-override:Magento 2 命令自动将文件复制到活动主题中

    Magento 2 复制主题覆盖命令 ...通过 composer 安装composer require jahvi/magento2-copy-theme-override --dev 运行php bin/magento setup:upgrade 这个怎么运作? 安装扩展后,您将可以访问一个新命令: ...

    fastify-method-override-wrapper:固定包装器以覆盖HTTP动词,以防客户端不支持它们

    npm install fastify-method-override-wrapper 用法 import fastify from 'fastify' ; import wrapFastify from 'fastify-method-override-wrapper' ; const wrappedFastify = wrapFastify ( fastify ) ; const app...

    java代码-Override

    在Java编程语言中,`Override`关键字是一个非常重要的概念,它用于标识一个方法是重写了父类中的同名方法。这个关键词确保了子类的方法能够覆盖或实现接口中定义的抽象方法,从而提供了多态性,这是面向对象设计的...

    blog-android-configuration-override

    在“blog-android-configuration-override-master”这个压缩包中,很可能包含了上述概念的示例代码或教程。通过解压并研究这些文件,开发者可以学习如何在实际项目中灵活地控制和调整Android应用的配置,以实现更...

    java-websocket jar包

    Java WebSocket 是一种基于Java语言实现的WebSocket协议库,主要用于实现在Web应用中提供实时的双向通信功能。WebSocket协议是HTML5规范的一部分,它允许客户端和服务器之间建立持久性的连接,从而实现数据的双向推...

    设计模式之-----组合模式 java

    在Java中,这通常通过接口或抽象类来实现,让组合和组件共享相同的公共接口。 下面我们将详细探讨组合模式的组成部分和实现步骤: 1. **组件接口**:这是所有组件(包括叶子节点和组合节点)都必须实现的接口。它...

    对应源码

    **ViewPager详解(四)——自主实现滑动指示条** 在Android开发中,ViewPager是一个非常重要的组件,它允许用户左右滑动来浏览多个页面,通常用于实现类似轮播图或者Tab切换的效果。本篇将深入讲解如何在ViewPager...

Global site tag (gtag.js) - Google Analytics