Quá tải và ghi đè


104

Sự khác biệt giữa quá tải và ghi đè là gì.


2
@james: ít nhất bạn đã thử google chưa ??
Mitch Wheat,

Tôi đoán bạn sẽ không nhận được cái này.
Jon B

james- có lẽ là không và tôi cảm thấy khá ngớ ngẩn khi không thể giải thích một khái niệm đơn giản

1
@james đoán của tôi là bạn đã trực giác những khái niệm này mà không biết các thuật ngữ. Tôi đoán bạn đang tự học. Bạn có thể nên chọn một cuốn sách trình độ C # mới bắt đầu, không phải để học mà để củng cố những gì bạn đã biết. Điều đó thật mệt mỏi nhưng sẽ giúp ích rất nhiều trong các cuộc phỏng vấn về công nghệ.
Michael Meadows

bạn có thể đọc thêm trên liên kết này: intquesans.blogspot.com/2011/05/…

Câu trả lời:


219

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
        }
}

1
tôi thích câu trả lời này @cgreeno .. Cảm ơn
Ferrakkem Bhuiyan

1
@cgreeno tôi nghĩ rằng bạn bỏ lỡ voidcho getStufftrongtest2
Mahdi

2
chỉ đề cập rằng phương thức lớp cơ sở phải được đánh dấu là ảo để ghi đè nếu không, bạn sẽ gặp lỗi biên dịch.
Alex Stephens

Này, cái này có thể đã cũ nhưng tôi vẫn còn thắc mắc về cái này. Quá tải có làm cho nó có sẵn để có nhiều chức năng hơn với phương thức 'một' không? Giống như tôi có thể làm điều này: 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 đó?
Sj03rs

Tôi nghĩ rằng ví dụ Ghi đè thực sự là Ghi đè, ghi đè là khi phương thức siêu lớp của bạn bị ghi đè một cách tình cờ hoặc nếu bạn muốn làm điều đó bằng cách sử dụng từ khóa mới trong cả hai trường hợp, ghi đè hoặc ghi đè, behaivor sẽ khác khi bạn khai báo Parent p = new Đứa trẻ(); p.Method (); ... có lẽ tôi đã sai và nó chỉ là một cách khác để làm điều tương tự. Có ai có thể giải thích nó tốt hơn tôi không?
Cristina Carrasco

35

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");
    }
}

Có lẽ bạn muốn nói thêm rằng khái niệm ghi đè áp dụng cho mối quan hệ lớp cha-lớp con.
Freakyuser

10

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.

  • Nếu đối tượng đầu vào được cung cấp là Xe ô tô, nó sẽ thực hiện Rửa (Xe bất kỳ Xe nào)
  • Nếu đối tượng đầu vào được cung cấp là Xe tải, thì nó sẽ thực hiện Rửa (Xe tải bất kỳ)

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.


1
Đây chắc hẳn là câu trả lời. Đã bỏ phiếu +
Jack

9
  • Overloading = Nhiều chữ ký phương thức, cùng một tên phương thức
  • Overriding = Chữ ký cùng một phương thức (được khai báo là ảo), được thực hiện trong các lớp con

Một người phỏng vấn sắc sảo sẽ theo dõi:

Sự khác biệt giữa ghi đè và phủ bóng là gì?


Không bao giờ biết nó được gọi là bóng, biết tốt. Việc ghi đè và ghi đè mối quan hệ duy nhất có là bỏ qua.
Samuel

4

Như Michael đã nói:

  • Overloading = Nhiều chữ ký phương thức, cùng một tên phương thức
  • Overriding = Chữ ký cùng một phương thức (được khai báo là ảo), được thực hiện trong các lớp con

  • Shadowing = Nếu được coi là DerivedClass, nó sử dụng phương thức dẫn xuất, nếu là BaseClass, nó sử dụng phương thức cơ sở.

3

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

2

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ảicuối cùng , bạn có thể ghi đè hoặc triển khai nếu Car là trừu tượng


1

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.


1

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


Tốt, với các chi tiết cần thiết.
user3885927

1

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.


Thuyền trưởng ở đây: Nạp chồng một phương thức cung cấp cho bạn nhiều chữ ký của các phương thức khác nhau có cùng tên. Ghi đè ẩn một thành viên được kế thừa, từ các lớp hoặc giao diện. bay đi
SparK

1
@SparK Overriding không ẩn thành viên. Bạn có thể ghi đè hoặc ẩn một thành viên được kế thừa. Hai là lựa chọn loại trừ lẫn nhau.
Servy

@Servy, chọn từ sai, ý tôi là "sản phẩm thay thế".
SparK

0

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.

Phương pháp ghi đè Vs ẩn

Quá tải phương thức


0

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 đè.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.