2012-06-10 44 views
7

Tôi có chính xác tuyên bố phương thức abstract tự động làm cho nó ảo không?Phương pháp trừu tượng có phải là ảo không?

Tức là, trong các lớp con tôi có thể ghi đè lên nhiều lần và khi chạy, phương thức tương ứng với kiểu thời gian chạy của đối tượng sẽ được gọi?

Có thể khai báo phương pháp trừu tượng không ảo không? Đó là, phương pháp phải được thực hiện trong một lớp con không trừu tượng và không thể bị ghi đè?

+0

bản sao có thể có của [Có phải mọi hàm trừu tượng ảo trong C#, nói chung không?] (Http://stackoverflow.com/questions/391557/is-every-abstract-function-virtual-in-c-in-general) –

Trả lời

8

Có, abstract methods are virtual theo định nghĩa; chúng phải được ghi đè để thực sự bị ghi đè bởi các lớp con:

Khi một tuyên bố phương pháp thể hiện bao gồm một phương pháp trừu tượng. Mặc dù một phương pháp trừu tượng cũng là một phương pháp ảo, nhưng không thể sửa đổi được virtual.

Ngược lại bạn không thể khai báo phương pháp trừu tượng không ảo, vì nếu bạn có thể, bạn sẽ có phương pháp không thể triển khai và do đó không bao giờ được gọi, làm cho nó trở nên vô dụng.

Tuy nhiên, nếu bạn muốn có một lớp học thực hiện một phương pháp trừu tượng nhưng không cho phép bất kỳ lớp con của nó để thay đổi thực hiện, đó là nơi sealed do thỏa thuận hợp Ví dụ:.

abstract public class AbstractClass 
{ 
    abstract public void DoSomething(); 
} 

public class BaseClass : AbstractClass 
{ 
    public sealed override void DoSomething() 
    { 
     Console.WriteLine("Did something"); 
    } 
} 

Chú ý rằng trong khi trừu tượng phương pháp là (ngầm) ảo, việc thực hiện trong lớp cơ sở cụ thể là không ảo (vì từ khóa sealed).

1

Có, chúng là ảo. Nếu không, bạn sẽ không có cách nào để viết thực hiện cho họ.

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