Computer >> Máy Tính >  >> Lập trình >> C ++

Mẫu trong C ++ so với Generics trong Java

Mẫu là nền tảng của lập trình chung, liên quan đến việc viết mã theo cách độc lập với bất kỳ kiểu cụ thể nào.

Mẫu là một kế hoạch chi tiết hoặc công thức để tạo một lớp hoặc một hàm chung. Các vùng chứa thư viện như trình lặp và thuật toán là ví dụ về lập trình chung và đã được phát triển bằng cách sử dụng khái niệm mẫu.

Có một định nghĩa duy nhất cho mỗi vùng chứa, chẳng hạn như vectơ, nhưng chúng ta có thể xác định nhiều loại vectơ khác nhau, chẳng hạn như vectơ hoặc vectơ .

Mã mẫu

#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max (T const& a, T const& b) {
   return a < b ? b:a;
}
int main () {
   int i = 39;
   int j = 20;
   cout << "Max(i, j): " << Max(i, j) << endl;
   double f1 = 13.5;
   double f2 = 20.7;
   cout << "Max(f1, f2): " << Max(f1, f2) << endl;
   string s1 = "Hello";
   string s2 = "World";
   cout << "Max(s1, s2): " << Max(s1, s2) << endl;
   return 0;
}

Đầu ra

Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World

Mặt khác, Java dưới dạng Generics.

Các phương thức chung của Java và các lớp chung cho phép người lập trình chỉ định, với một khai báo phương thức duy nhất, một tập hợp các phương thức liên quan hoặc với một khai báo lớp duy nhất, một tập hợp các kiểu liên quan, tương ứng.

Generics cũng cung cấp sự an toàn cho kiểu thời gian biên dịch cho phép lập trình viên bắt các kiểu không hợp lệ tại thời điểm biên dịch.

Sử dụng khái niệm Java Generic, chúng ta có thể viết một phương thức chung để sắp xếp một mảng đối tượng, sau đó gọi phương thức chung với mảng Số nguyên, Mảng đôi, Mảng chuỗi, v.v. để sắp xếp các phần tử của mảng.

Phương pháp Chung

Bạn có thể viết một khai báo phương thức chung duy nhất có thể được gọi với các đối số thuộc các kiểu khác nhau. Dựa trên các loại đối số được truyền cho phương thức chung, trình biên dịch xử lý từng lệnh gọi phương thức một cách thích hợp. Sau đây là các quy tắc để xác định các Phương thức Chung -

  • Tất cả các khai báo phương thức chung đều có phần tham số kiểu được phân tách bằng dấu ngoặc nhọn () đứng trước kiểu trả về của phương thức ( trong ví dụ tiếp theo).

  • Mỗi phần tham số kiểu chứa một hoặc nhiều tham số kiểu được phân tách bằng dấu phẩy. Tham số kiểu, còn được gọi là biến kiểu, là một số nhận dạng chỉ định tên kiểu chung.

  • Các tham số kiểu có thể được sử dụng để khai báo kiểu trả về và hoạt động như trình giữ chỗ cho các kiểu đối số được truyền cho phương thức chung, được gọi là đối số kiểu thực tế.

  • Phần thân của một phương thức chung được khai báo giống như của bất kỳ phương thức nào khác. Lưu ý rằng các tham số kiểu chỉ có thể đại diện cho các kiểu tham chiếu, không phải kiểu nguyên thủy (như int, double và char).

Mã mẫu

public class GenericMethodTest {
   // generic method printArray
   public static < E > void printArray( E[] inputArray ) {
      // Display array elements
      for(E element : inputArray) {
         System.out.printf("%s ", element);
      }
      System.out.println();
   }
   public static void main(String args[]) {
      // Create arrays of Integer, Double and Character
      Integer[] intArray = { 1, 2, 3, 4, 5 };
      Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
      Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
      System.out.println("Array integerArray contains:");
      printArray(intArray); // pass an Integer array
      System.out.println("\nArray doubleArray contains:");
      printArray(doubleArray); // pass a Double array
      System.out.println("\nArray characterArray contains:");
      printArray(charArray); // pass a Character array
   }
}

Đầu ra

Array integerArray contains:
1 2 3 4 5
Array doubleArray contains:
1.1 2.2 3.3 4.4
Array characterArray contains:
H E L L O

Bây giờ chúng ta hãy xem sự khác biệt giữa Mẫu và thuốc gốc. Sự khác biệt như bên dưới -

  • Nó sử dụng Type-Erasure; điều này đảm bảo kiểm tra kiểu chặt chẽ hơn trong thời gian biên dịch. Generics trong Java cung cấp sự an toàn về thời gian biên dịch và loại bỏ sự cần thiết của việc đánh máy. Điều này trực tiếp xuất hiện trong giao diện người dùng của trình biên dịch java để đảm bảo loại xóa này được thực hiện.

  • Trong C ++, nếu các mẫu được sử dụng, trình biên dịch sẽ phát lại mã mẫu sau khi thay thế các tham số chung trong nó bằng loại đã cho.

  • Trong Java, ngay cả khi chúng ta phải chỉ định kiểu dữ liệu, trong đó hàm gọi bằng bất kỳ đối tượng nào, chúng ta không cần đánh máy nó tương tự như trong C ++ với kiểu dữ liệu thực tế, thay vì các lớp trình bao bọc để thực hiện yêu cầu.

  • Java generics sử dụng tính năng kiểm tra kiểu trong thời gian khởi tạo và tạo mã byte tương đương với mã không chung chung C ++ có “kiểu nhập sau” và lập trình meta mẫu, đồng thời tạo lớp mới cho mỗi lần khởi tạo.