2009-05-13 29 views
5

ai cũng có thể giải thích quá tải, ghi đè và ẩn trong .Net?Quá tải, ghi đè và ẩn?

Cảm ơn

+3

http://stackoverflow.com/questions/673721/overloading-and-overriding –

+0

có thể trùng lặp của [Đa hình so với ghi đè và quá tải] (http://stackoverflow.com/questions/154577/polymorphism-vs-overriding- vs-overloading) – Ian

Trả lời

5

Quá tải là khi bạn tạo nhiều phương pháp, với các thông số khác nhau. Ví dụ:

 
public class Car 
{ 
    public Car() 
    { 
    // Do stuff 
    } 

    public Car(int numberOfCylinders) 
    { 
    // Do stuff 
    } 
} 

Bạn có thể thấy hàm tạo có cùng tên, nhưng các thông số khác nhau. Bạn sẽ thấy các phương thức quá tải và các hàm tạo trong Visual Studio trong Intellisense, với các mũi tên nhỏ đi lên và xuống để bạn có thể duyệt các chữ ký.

Ghi đè là khi bạn cung cấp triển khai mới cho phương thức từ lớp cơ sở. Ví dụ:

 
    public class Square 
    { 
     public double x; 

     // Constructor: 
     public Square(double x) 
     { 
     this.x = x; 
     } 

     public virtual double Area() 
     { 
     return x*x; 
     } 
    } 

    class Cube: Square 
    { 
     // Constructor: 
     public Cube(double x): base(x) 
     { 
     } 

     // Calling the Area base method: 
     public override double Area() 
     { 
     return (6*(base.Area())); 
     } 
    } 

Lưu ý rằng trong C#, bạn không thể override phương pháp không ảo hoặc tĩnh.

+0

Lưu ý rằng trong C#, bạn không thể ghi đè lên một phương thức tĩnh hoặc tĩnh.bạn có nghĩa là các phương thức tĩnh không được kế thừa? – NoviceToDotNet

12

quá tải đang cung cấp nhiều phương pháp có cùng tên và chữ ký khác nhau:

void Foo() {...} 
void Foo(int i) {...} 

Overriding được sử dụng trong thừa kế để thay đổi việc thực hiện mỗi lớp con:

class SomeBase { 
    public virtual void Foo() {} 
} 
class SomeOther : SomeBase { 
    public override void Foo() { 
     // different implementation, possibly calling base.Foo(); 
    } 
} 

Với trên, ngay cả khi tôi làm:

SomeBase obj = new SomeOther(); 
obj.Foo(); 

nó sẽ gọi số SomeOther.Foo triển khai. Phương thức được gọi phụ thuộc vào loại dụ, không phải là biến.

Phương thức ẩn là đối diện; nó thay thế chữ ký phương pháp, nhưng chỉ áp dụng nếu bạn gọi phương thức từ các loại có nguồn gốc:

class SomeBase { 
    public void Foo() {} 
} 
class SomeOther : SomeBase { 
    public new void Foo() { 
     // different implementation, possibly calling base.Foo(); 
    } 
} 

Bây giờ là:

SomeOther obj = new SomeOther(); 
SomeBase baseObj = obj; 
obj.Foo(); // calls SomeOther.Foo 
baseObj.Foo(); // calls SomeBase.Foo 

tức là các cuộc gọi phương pháp phụ thuộc vào biến, không phải là ví dụ.

+0

Bạn có nghĩa là gì? Phương pháp ghi đè: \t ảo (trong BASE) + ghi đè (trong DERIVED), Phương thức Ẩn: \t {nothing} (trong BASE) + mới (trong DERIVED) –

20

Quá tải là định nghĩa của nhiều "chữ ký" có thể có của một phương thức hoặc toán tử duy nhất. Mỗi chữ ký có các đối số khác nhau và về cơ bản là một hàm riêng biệt, không khác với hàm đa hàm có các tên khác nhau. Điều này thường được sử dụng để nhóm các hoạt động khái niệm tương tự, chẳng hạn như quá tải + để làm việc với BigInteger và với String: cả hai hoạt động có vẻ hợp lý để sử dụng + cho (trừ khi bạn nghĩ rằng tất cả các quá tải của + nên xác định Abelian groups - quá tải String).

Overriding là định nghĩa của nhiều càng tốt triển khai của chữ ký phương pháp tương tự, như vậy mà thực hiện được xác định bởi các kiểu thời gian chạy của các đối số 0 (thường được xác định bởi tên this trong C#).

Ẩn là định nghĩa của một phương pháp trong một loại hình xuất phát với một chữ ký giống hệt như trong một trong các loại cơ sở của nó mà không trọng.

Sự khác biệt thực tiễn giữa trọng và ẩn nấp như sau:

  • Nếu một phương pháp là ghi đè, việc thực hiện để gọi được dựa trên thời gian chạy loại của đối số this.
  • Nếu phương pháp chỉ đơn giản là ẩn, việc triển khai cuộc gọi được dựa trên loại đối số biên dịch đối số this.
-2

Trong thuật ngữ đơn giản:

quá tải là khi bạn có tên cùng một phương pháp có ký hiệu khác. Điều này có thể ở cùng một lớp. Ví dụ:

int Add (int a, int b) 
{ 
    return a + b; // returns int 
} 
float Add (float a, float b) 
{ 
return a + b; // returns float 
} 

Ghi đè là khi bạn có cùng tên phương thức và chữ ký trong lớp dẫn xuất như trong lớp cơ sở. Trong trường hợp này, chúng ta nói lớp dẫn xuất ghi đè phương thức lớp cơ sở. Phương thức nào chạy tùy thuộc vào trường hợp nào gọi phương thức

ví dụ:

public class Shape 
    { 
     public virtual void Draw() { } 

    } 

    public class Square : Shape 
    { 
     public override void Draw() 
     { 
      // Code to draw square 
     } 
    } 

    public class Circle : Shape 
    { 
     public override void Draw() 
     { 
      // Code to draw circle 
     } 
    } 

Ẩn hoặc đóng gói là khi bạn khai báo các biến thành viên và phương pháp của một lớp riêng để họ không thể được truy cập bởi bất kỳ lớp khác, không phải ngay cả những lớp học có nguồn gốc

Ví dụ:

private int onlyICanAccess; 

private void OnlyICanExecute() 
{ 
    // ... 
} 
+0

Điều này không ẩn trong ngữ cảnh này. – perfectionist

+0

@perfectionist Nó vẫn đang ẩn nấp –

-2

quá tải là một ví dụ về morphsm poly, bạn có thể overloa số, kiểu dữ liệu và chuỗi các tham số đã được thông qua giữa hai phương pháp ..

trọng (khác nhau từ ảo) có nghĩa là một số chức năng được xác định là có, , nhưng bạn có thể cho ý tưởng rõ ràng hơn tại thời điểm inheritind

phương tiện ẩn giấu các tính năng nội bộ và đại diện cho các tính năng cần thiết, một trong những tính năng của OOP khái niệm

Google để có được thông tin detaied

4

Giả sử rằng bạn hiểu những lời giải thích do áp phích khác, một cách để nhớ sự khác biệt giữa quá tải và quan trọng nhất là rằng, khi sử dụng trên tải ing, có khả năng 'tải' các chức năng có cùng tên .

Ngớ ngẩn, tôi biết, nhưng nó phù hợp với tôi.

Các vấn đề liên quan