Javaの汎用型とC++のテンプレート
2402 ワード
1.Javaにおけるクラス保有オブジェクトによるクラス汎用性に関する考え方
以上のDemoクラスでは、すべてのDemoインスタンスがFruitオブジェクトのみをデータメンバーとして持つことができ、使用範囲は小さい.このような問題は、クラスが持つオブジェクトをベースクラス(例えばObject)と宣言してクラスがベースクラスとその派生クラスを持つ機能を実現することと、Javaの汎用型によってクラスのパラメータを汎化し、タイプパラメータを実現することの2つの方法で解決できます.以下、それぞれ例を挙げる.
2.C++の単純テンプレートクラス
総じて,Javaに導入された汎用型はやはりC++のテンプレートに似ているが,もちろん,これはタイプパラメータの理解によるものである.また,Javaでは単独でメソッドに汎用を適用できるが,C++はもちろん,本来はプロセス式とオブジェクト向けのプログラミングモードを兼ね備えており,Javaにおける汎用メソッドを関数テンプレートで実現できるのは当然である.
//1.
class Fruit{}
public class Demo{
private Fruit fruit;
public Demo(){}
public Demo(Fruit fruit){
this.fruit = fruit;
}
public Fruit get(){
return fruit;
}
public void set(Fruit newFruit){
fruit = newFruit;
}
// toString()
public String toString(){
return "Fruit in Demo.";
}
public static void main(String[] args){
Demo demo = new Demo(new Fruit());//Demo Fruit
System.out.println(demo);
}
}
以上のDemoクラスでは、すべてのDemoインスタンスがFruitオブジェクトのみをデータメンバーとして持つことができ、使用範囲は小さい.このような問題は、クラスが持つオブジェクトをベースクラス(例えばObject)と宣言してクラスがベースクラスとその派生クラスを持つ機能を実現することと、Javaの汎用型によってクラスのパラメータを汎化し、タイプパラメータを実現することの2つの方法で解決できます.以下、それぞれ例を挙げる.
//2.
class Demo1{
private Object obj;
public Demo1(){}
public Demo1(Object obj){
this.obj = obj;
}
// toString()
//...
}
//3.
class Demo2<T>{
private T t;
public Demo2(){}
public Demo2(T t){
t = this.t;
}
// toString()
//...
}
//
class Car{}
public class Test{
public static void main(String[] args){
Demo1 first = new Demo1(new String());//Demo1 first String
Demo1 second = new Demo1(new Car());//Demo1 second Car
Demo2<Car> instance1 = new Demo2<Car>(new Car());//Demo2 instance1 Car
Demo2<String> instance2 = new Demo2<String>(new String());//Demo2 instance2 String
}
}
2.C++の単純テンプレートクラス
#include<iostream>
using namespace std;
template<class T>
class Demo{
private:
T t;
public:
Demo();
Dmeo(T first, T second);
void set(T t);
T get() const;
};
template<class T>
Demo<T>::Demo(){}
template<class T>
Demo<T>::Demo(T t){
this->t = t;
}
template<class T>
void Demo<T>::set(T t){
this->t = t;
}
template<class T>
T Demo<T>::get() const{
return t;
}
int main(){
//...
return 0;
}
// C++
総じて,Javaに導入された汎用型はやはりC++のテンプレートに似ているが,もちろん,これはタイプパラメータの理解によるものである.また,Javaでは単独でメソッドに汎用を適用できるが,C++はもちろん,本来はプロセス式とオブジェクト向けのプログラミングモードを兼ね備えており,Javaにおける汎用メソッドを関数テンプレートで実現できるのは当然である.