2009-07-24 76 views
22

tôi gặp khó khăn khi tìm hiểu các lỗi cơ bản với mã dưới đây:Điểm của một phương thức tĩnh trong một lớp không tĩnh là gì?

class myClass 
{ 
    public void print(string mess) 
    { 
     Console.WriteLine(mess); 
    } 
} 

class myOtherClass 
{ 
    public static void print(string mess) 
    { 
     Console.WriteLine(mess); 
    } 
} 

public static class Test 
{ 
    public static void Main() 
    { 
     myClass mc = new myClass(); 
     mc.print("hello"); 

     myOtherClass moc = new myOtherClass(); 
     moc.print("vhhhat?"); 
     //This says I can't access static method in non static context, but am I not? 

    } 
} 

tôi có thể không bao giờ nghĩ ra một lý do tại sao người ta sẽ khai báo một phương pháp tĩnh trong một lớp học không tĩnh, vậy tại sao sẽ NET không ném một lỗi ngoại lệ.

Hơn nữa,

moc.print("vhhhat?"); 

này sẽ nói rằng tôi không thể truy cập phương pháp tĩnh trong bối cảnh tĩnh không nhưng thử nghiệm và chính được tĩnh, những gì là nó đề cập đến?

+0

Xem 'XmlReader.Create' cho một ví dụ về một phương thức tĩnh trong một lớp không tĩnh. –

+5

Vấn đề là các tên đều xấu. Một "phương pháp tĩnh" thực sự nên được gọi là một cái gì đó giống như một "phương pháp chia sẻ", vì nó là trong VB. Một lớp là một kế hoạch chi tiết cho việc xây dựng các đối tượng, nhưng các lớp tĩnh không thể xây dựng được, do đó chúng không được gọi là các lớp. Một lần nữa, VB làm cho nó đúng, và gọi chúng là "mô-đun". Khi tên có tính mô tả thì việc trả lời câu hỏi trở nên dễ dàng hơn. Câu hỏi của bạn là: Tại sao bạn sẽ có một "phương thức chia sẻ" trong một lớp học, không phải trong một mô-đun? Trả lời: Để chia sẻ nó giữa các trường hợp của lớp của nó. –

Trả lời

21

Một lớp tĩnh có nghĩa là bạn không thể sử dụng nó trong một bối cảnh không tĩnh, có nghĩa là bạn không thể có một đối tượng instantiation của lớp đó và gọi phương thức. Nếu bạn muốn sử dụng phương pháp in của bạn, bạn sẽ phải làm:

myOtherClass.print("vhhhat?"); 

Đây không phải là tĩnh, như bạn đã tạo một instantiation của lớp được gọi là moc:

myOtherClass moc = new myOtherClass(); 
0

Khi bạn đang gọi một phương pháp trên một đối tượng đối tượng bạn đang gọi nó trong ngữ cảnh không tĩnh. Nó là không có tầm quan trọng trong đó phương pháp bạn làm điều này.

11

This will say I can't access static method in non static context but Test and main are static, what is it referring to ?

Điều này đề cập đến thực tế là bạn đang tham chiếu một phương thức tĩnh (myOtherClass.print) sử dụng một cá thể (moc). Bạn sẽ phải làm lại điều này là:

myOtherClass.print("vhhhat?"); 

Điều đó sẽ biên dịch chính xác.

Phương pháp tĩnh là các phương thức hoạt động trên chính lớp đó, không phải là một cá thể cụ thể của lớp. Điều này có nhiều công dụng - một ví dụ là để triển khai thực hiện Factory method pattern.

3

Đôi khi "mục tiêu" của hàm này đặc biệt đối với lớp chứ không phải đối tượng (thể hiện của lớp).

Ví dụ, một phương pháp nhà máy:

SomeClass obj = SomeClass.CreateInstance(); 

Đây là rõ ràng hơn khi ngôn ngữ có cơ sở lập trình meta cho phép hoạt động trên lớp. Trong Python, sự khác biệt này được thể hiện rõ hơn theo quy ước: tham số đầu tiên được truyền cho một hàm có tên là "cls" hoặc "self" và cho biết hàm có thể hoạt động trên lớp (khi đó là "phương thức lớp") hoặc thể hiện (loại bạn quen với, khi đó là một phương thức thể hiện).

8

Thứ nhất, lỗi:

moc.print("vhhhat?"); 

Đang cố gắng để gọi một phương thức tĩnh trên một thể hiện của lớp (ví dụ: một bối cảnh không tĩnh). Để gọi đúng cách print(), bạn sẽ làm

myOtherClass.print("vhhhat?"); 

Đối với câu hỏi đầu tiên, có nhiều lý do để có phương pháp tĩnh trong một lớp không tĩnh. Về cơ bản, nếu có một hoạt động liên kết với lớp, nhưng không phải với bất kỳ trường hợp cụ thể nào của lớp, nó phải là một phương thức tĩnh. Ví dụ, String.Định dạng() (hoặc bất kỳ phương thức tĩnh String nào) không nên hoạt động trên các cá thể chuỗi, nhưng chúng phải được liên kết với lớp String. Vì vậy chúng tĩnh.

0

Chương trình đúng sẽ là: -

class myClass 
{ 
    public void print(string mess) 
    { 
     Console.WriteLine(mess); 
    } 
} 

class myOtherClass 
{ 
    public static void print(string mess) 
    { 
     Console.WriteLine(mess); 
    } 
    public void printMe(string mess) 
    { 
     Console.WriteLine(mess); 
    } 
} 

public static class Test 
{ 
    public static void Main() 
    { 
     myClass mc = new myClass(); 
     mc.print("hello"); 

     myOtherClass moc = new myOtherClass(); 
     myOtherClass.print("vhhhat?"); 
     moc.printMe("test me"); 


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