Tìm hiểu Overriding và Overloading trong OOP, Difference between method overriding and overloading Difference between method overriding and overloading.
Trong OOP, overriding và overloading là 2 kỹ thuật giúp tạo nên Tính đa hình (Polymorphism), một trong những sức mạnh của lập trình hướng đối tượng. Bài viết này chúng ta sẽ tìm hiểu về khái niệm, cách dùng và tác dụng của 2 kỹ thuật nêu trên.

Trong phạm vi bài viết này chúng ta chỉ để cập đến 2 kỹ thuật này trong Method. Trong lập trình, chúng ta không thể nào khai báo các function (method) trùng tên, nhưng trong OOP chỉ cần áp dụng hai kỹ thuật này, chúng ta hoàn toàn có thể làm được điều đó.
#bl1 Overriding
Khi sử dụng Overriding, bạn đã thay đổi hành vi của method mà nó override. Nói đơn giản là nó đã ghi đè nội dung lên method trước đó. Lưu ý, method này phải được khai báo giống hệt method trước cả đối số và kiểu trả về.
- Overriding thường được sử dụng trong method ở lớp con.
#bl3 Một số quy tắc sử dụng phương thức overriding:
  • Các phương thức được mô tả static thì không overriden nhưng được mô tả lại.
  • Các phương thức không kế thừa sẽ không được overriden (hiển nhiên).
  • Chỉ có thể override các phương thức không phải final (java) được khai báo là public hoặc protected.

#bl1 Overloading
Overloading đơn giản chỉ để tạo ra các method cùng tên trong cùng một Class. Nhưng các method đó phải khác nhau về đối số đầu vào (argument) hoặc kiểu trả về.
- Các method với kỹ thuật này không ghi đè mà cùng tồn tại song song.

#bl1 Ví dụ với C#
Với OOP thì C# là một ngôn ngữ thể hiện nó rõ nhất, thích hợp với các bạn mới tìm hiểu về OOP
#bl2 Kỹ thuật Overriding
class A
{
/* Chỉ những phương thức chứ từ khóa virtual hoặc abstract
mới cho phép override. */
public virtual string Hello()
{
return "Class A";
}
}

class B:A
{
public override string Hello()
{
retuen "Class B";
}
}
#bl2 Kỹ thuật Overloading
class A
{
public string Hello()
{
return "No argument";
}
public string Hello(string name)
{
return "Hello" + name;
}
public int Hello()
{
return 1;
}
}

#bl1 Ví dụ với PHP
OOP mới được hoàn chỉnh từ PHP5, việc khai báo một số kỹ thuật không rõ ràng như trong C#. Bạn có thể thấy điều đó trong ví dụ bên dưới.
#bl2 Kỹ thuật Overriding
<?php
// Trong php ta không cần từ khóa override hay vitual.
class A {
function Hello() {
return "Class A";
}
}

class B extends A {
function Hello() {
return "Class B";
}
}

$obj = new B();
echo $obj->Hello();
?>

#bl2 Kỹ thuật Overloading
Việc khai báo function trong PHP chỉ lưu ý đến tên mà không quan tâm đến đối số đầu vào như trong C#, do vậy Overriding không thật sự phát huy khả năng trong PHP.
<?php
class A {
function Hello() {
for ($i = 0; $i < func_num_args(); $i++) {
printf("Argument %d: %s\n", $i, func_get_arg($i));
}
}
}

$obj = new A();
$obj->Hello('Linda','John');
?>
Hoặc
<?php
class Test
{
// PHP5 bổ sung __call() để hỗ trợ overloading
// nhưng nó khá rắc rối!
public function __call($nameMethod, $args)
{
switch($nameMethod) {
case "Hello":
switch(count($args)) {
case 1:
echo "Call: function HelloOne()"."<br>"; break;
default:
echo "Call: function Hello()"."<br>"; break;
}
break;
case "Goodbye":
echo "Call: function Bye()"."<br>"; break;
default:
echo "Nothing"; break;
}
}
}

$obj = new Test;
$obj->Hello('Linda');
$obj->Hello();
$obj->Goodbye();
$obj->Goodbye('Linda');
$obj->Say();
?>
Cùng SaliproIT Blog chia sẻ Thế giới công nghệ 4.5 sao