泛型,模版 是面向对象语言的一个重要特征,它是重载,多态的发展。
C# 的泛型 定义和调用都是跟在类名之后,函数名之后,添加尖括号和泛型即可。类模版和函数模版可以同时使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyTest
{
public class TemplateTest<T>
{
public void test<K,V>(K my1,V my2,T my3)
{
Console.WriteLine(my1);
Console.WriteLine(my2);
Console.WriteLine(my3);
}
public TemplateTest(T Test)
{
}
}
}
TemplateTest<int> TemplateTest = new TemplateTest<int>(1);
TemplateTest.test<Int16, float>(2, 3.0f, 3);//显式
TemplateTest TemplateTest2 = new TemplateTest();
TemplateTest.test(2, 3.0f, 3);//隐式
java 的泛型 : 定义和调用类模版是写在类名之后,定义和调用函数模版是写在返回值之前,添加尖括号和泛型即可。类模版和函数模版可以同时使用
package com.zg.mymes;
/**
* @Auther: Zg
* @Date: 2023/3/12 - 03 - 12 - 20:07
* @Description: com.zg.mymes
* @version: 1.0
*/
public class MyTest<T> {
public <T1, T2>void test1(T my, T1 my1, T2 my2){
System.out.println(my);
System.out.println(my1);
System.out.println(my2);
}
}
@Test
void Test35(){
MyTest<Integer> myTest = new MyTest(); //指定类型
myTest.<Float,String>test1(1,3.f,"test");//指定类型
MyTest myTest1 = new MyTest(); //推断
myTest.test1(1,3.f,"test");
}
cpp:
cpp的类模版和函数模版最好不要同时使用:
函数模版:cpp的函数模版可以自动推断,泛型定义为template<typename T1, typename T2>,template<class T1,class T2>,定义写在类/函数的返回值之前,调用写在函数名之后
#ifndef MYBASECLASS_H
#define MYBASECLASS_H
#include<iostream>
#include<string>
using namespace std;
class MyBaseClass
{
public:
MyBaseClass();
template<typename T1, typename T2> void testFuc(T1 ¶m1, T2¶m2);
};
template<typename T1, typename T2>
void MyBaseClass::testFuc(T1 ¶m1, T2¶m2)
{
cout<<"this is"<<param1<<param2<<endl;
}
#endif // MYBASECLASS_H
MyBaseClass *mybase = new MyBaseClass() ;
int data1 = 10;
string data2 = "test2";
mybase->testFuc(data1,"tttttt"); //隐式类型,可以推断
mybase->testFuc<int, string>(data1,data2); //显式类型
delete mybase;
mybase = NULL;
类模版:
#ifndef MYBASE2_H
#define MYBASE2_H
#include <iostream>
#include<string>
using namespace std;
template<class T1,class T2>class Mybase2
{
public:
Mybase2();
void printTest(T1 t1, T2 t2);
};
template<class T1, class T2>
void Mybase2<T1, T2>::printTest(T1 t1, T2 t2)
{
cout<<t1<<t2<<endl;
}
template<class T1, class T2> Mybase2<T1, T2>::Mybase2()
{
}
#endif // MYBASE2_H
Mybase2<int,string> *mybase2 = new Mybase2<int,string>();
mybase2->printTest(data1, data2);
delete mybase2;
mybase2 = NULL;