Sự khác biệt giữa quá tải và ghi đè là gì.
Sự khác biệt giữa quá tải và ghi đè là gì.
Câu trả lời:
Quá tải
Quá tải là khi bạn có nhiều phương thức trong cùng một phạm vi, có cùng tên nhưng chữ ký khác nhau.
//Overloading
public class test
{
public void getStuff(int id)
{}
public void getStuff(string name)
{}
}
Ghi đè
Ghi đè là một nguyên tắc cho phép bạn thay đổi chức năng của một phương thức trong một lớp con.
//Overriding
public class test
{
public virtual void getStuff(int id)
{
//Get stuff default location
}
}
public class test2 : test
{
public override void getStuff(int id)
{
//base.getStuff(id);
//or - Get stuff new location
}
}
void
cho getStuff
trongtest2
getStuff(2, "Hello world!");
hoặc tôi có thể làm điều này getStuff("Myname", "Mysurname", "Hello World!");
? Bất cứ ai có thể xác nhận đây là cách để làm điều đó?
Các định nghĩa đơn giản cho quá tải và ghi đè
Quá tải (Đa hình thời gian biên dịch) :: Các hàm có cùng tên và các tham số khác nhau
public class A
{
public void print(int x, int y)
{
Console.WriteLine("Parent Method");
}
}
public class B : A
{
public void child()
{
Console.WriteLine("Child Method");
}
public void print(float x, float y)
{
Console.WriteLine("Overload child method");
}
}
Ghi đè (Đa hình thời gian chạy) :: Các hàm trong lớp mở rộng có cùng tên và cùng tham số như trong lớp cơ sở, nhưng có các hành vi khác nhau.
public class A
{
public virtual void print()
{
Console.WriteLine("Parent Method");
}
}
public class B : A
{
public void child()
{
Console.WriteLine("Child Method");
}
public override void print()
{
Console.WriteLine("Overriding child method");
}
}
Tôi muốn chia sẻ một ví dụ có ý nghĩa rất lớn đối với tôi khi tôi đang học:
Đây chỉ là một ví dụ không bao gồm phương thức ảo hoặc lớp cơ sở. Chỉ để đưa ra một gợi ý về ý chính.
Giả sử có một máy rửa Xe và nó có một chức năng được gọi là "Rửa" và chấp nhận Xe như một loại.
Nhận đầu vào Xe và rửa Xe.
public void Wash(Car anyCar){
//wash the car
}
Hãy quá tải hàm Wash ()
Quá tải:
public void Wash(Truck anyTruck){
//wash the Truck
}
Chức năng rửa trước đây chỉ rửa Xe ô tô, nhưng bây giờ nó đã quá tải để rửa Xe tải.
Hãy ghi đè hàm Wash ()
Ghi đè:
public override void Wash(Car anyCar){
//check if the car has already cleaned
if(anyCar.Clean){
//wax the car
}
else{
//wash the car
//dry the car
//wax the car
}
}
Chức năng Wash lúc này có điều kiện để kiểm tra xem Xe đã sạch chưa cần rửa lại.
Nếu Xe sạch thì chỉ cần tẩy lông.
Nếu không sạch thì trước tiên rửa xe, lau khô rồi mới tẩy lông.
.
Vì vậy, chức năng đã bị ghi đè bằng cách thêm một chức năng mới hoặc làm điều gì đó hoàn toàn khác.
Một người phỏng vấn sắc sảo sẽ theo dõi:
Như Michael đã nói:
và
Có nhiều hơn một phương thức / hàm tạo có cùng tên nhưng khác tham số được gọi là quá tải. Đây là một sự kiện thời gian biên dịch.
Class Addition
{
int add(int a, int b)
{
return a+b;
}
int add(int a, int b, int c)
{
return a+b+c;
}
public static main (String[] args)
{
Addition addNum = new Addition();
System.out.println(addNum.add(1,2));
System.out.println(addNum.add(1,2,3));
}
}
O / p:
3
6
Ghi đè là một sự kiện thời gian chạy, có nghĩa là dựa trên mã của bạn, đầu ra sẽ thay đổi vào thời gian chạy.
class Car
{
public int topSpeed()
{
return 200;
}
}
class Ferrari extends Car
{
public int topSpeed()
{
return 400;
}
public static void main(String args[])
{
Car car = new Ferrari();
int num= car.topSpeed();
System.out.println("Top speed for this car is: "+num);
}
}
Lưu ý rằng có một phương thức chung trong cả hai lớp topSpeed (). Vì chúng tôi tạo ra một chiếc Ferrari, chúng tôi nhận được một kết quả khác.
O / p:
Top speed for this car is: 400
trong C # không có Java giống như ghi đè ẩn , không có ghi đè từ khóa trên phương thức ghi đè ! xem các triển khai C # sau:
biến thể 1 không ghi đè : kết quả là 200
class Car {
public int topSpeed() {
return 200;
}
}
class Ferrari : Car {
public int topSpeed(){
return 400;
}
}
static void Main(string[] args){
Car car = new Ferrari();
int num= car.topSpeed();
Console.WriteLine("Top speed for this car is: "+num);
Console.ReadLine();
}
biến thể 2 với từ khóa ghi đè : kết quả là 400
class Car {
public virtual int topSpeed() {
return 200;
}
}
class Ferrari : Car {
public override int topSpeed(){
return 400;
}
}
static void Main(string[] args){
Car car = new Ferrari();
int num= car.topSpeed();
Console.WriteLine("Top speed for this car is: "+num);
Console.ReadLine();
}
từ khóa virtual trên Car class ngược lại với final trên Java, có nghĩa là không phải là cuối cùng , bạn có thể ghi đè hoặc triển khai nếu Car là trừu tượng
shadowing = duy trì hai định nghĩa tại lớp dẫn xuất và để chiếu định nghĩa lớp cơ sở, nó phủ bóng (ẩn) định nghĩa lớp dẫn xuất và ngược lại.
Một điểm khác cần thêm.
Quá tải Nhiều hơn một phương thức có cùng tên. Loại trả lại giống nhau hoặc khác nhau. Không có tham số khác nhau hoặc Loại tham số khác nhau. Trong cùng một lớp hoặc lớp có nguồn gốc.
int Add (int num1, int num2) int Add (int num1, int num2, int num3) double Add (int num1, int num2) double Add (double num1, double num2)
Có thể có trong cùng một lớp hoặc lớp dẫn xuất. Nói chung thích học cùng lớp. Ví dụ: Console.WriteLine () có 19 phương thức được nạp chồng.
Có thể nạp chồng các phương thức, hàm tạo lớp.
Có thể coi là thời gian biên dịch đa hình (static / Early Binding).
================================================== ================================================== =
Ghi đèKhông thể ghi trong cùng một lớp. Có thể Ghi đè các phương thức, thuộc tính, chỉ mục, sự kiện của lớp.
Có một số hạn chế như Phương thức cơ sở được ghi đè phải là ảo, trừu tượng hoặc ghi đè. Bạn không thể sử dụng công cụ sửa đổi mới, tĩnh hoặc ảo để sửa đổi phương pháp ghi đè.
Có thể coi thời gian chạy (Dynamic / Late Binding) là đa hình.
Giúp lập phiên bản http://msdn.microsoft.com/en-us/library/6fawty39.aspx
================================================== ================================================== =
Liên kết hữu ích
http://msdn.microsoft.com/en-us/library/ms173152.aspx Đa hình thời gian biên dịch so với đa hình thời gian chạy
Quá tải là một phần của tính đa hình tĩnh và được sử dụng để triển khai các phương thức khác nhau có cùng tên nhưng khác chữ ký. Ghi đè được sử dụng để hoàn thành phương thức không hoàn chỉnh. Theo tôi không có sự so sánh giữa hai khái niệm này, điều duy nhất giống nhau là cả hai đều đi kèm với cùng một từ vựng đã qua.
Nạp chồng phương thức và Ghi đè phương thức là 2 khái niệm hoàn toàn khác nhau. Nạp chồng phương thức có cùng tên phương thức nhưng có các chữ ký khác nhau. Ghi đè phương thức đang thay đổi việc triển khai mặc định của phương thức lớp cơ sở trong lớp dẫn xuất. Dưới đây, bạn có thể tìm thấy 2 video hướng dẫn tuyệt vời giải thích các khái niệm này.
Overloading là khái niệm trong đó bạn có các chữ ký giống nhau hoặc các phương thức có cùng tên nhưng tham số khác nhau và ghi đè, chúng ta có các phương thức trùng tên với các tham số khác nhau cũng có tính kế thừa được gọi là ghi đè.