2012-02-01 41 views
10

Tôi có vấn đề sau trong Java: Tôi có một lớp cơ sở và một lớp dẫn xuất và tôi có một phương thức trong lớp cơ sở. Khi tôi gọi phương thức foo của Base thông qua Derived, tôi muốn lấy class của Derived. Phương pháp foo có thể là chung chung nếu nó có thể được thực hiện theo cách đó.Java: lấy lớp của lớp kế thừa từ một phương thức tĩnh

class Base 
{ 
    static void foo() 
    { 
     // I want to get Derived class here 
     // Derived.class 
    } 
} 

class Derived extends Base 
{ 
} 

Derived.foo(); 

Cảm ơn sự giúp đỡ của bạn!

David

+0

Tôi không chắc chắn điều này có thể thực hiện được, không phải với các phương pháp tĩnh theo cách bạn đã thực hiện. –

+2

"Tôi muốn có được lớp học của Derived" mà có vẻ là một điều kỳ lạ để làm. Lý do gì? Có thể có cách tốt hơn để giải quyết vấn đề thực sự của bạn – Raedwald

+0

Tôi có một mô hình gọi là ActiveModel và tôi muốn có giao diện Rails giống như thế này, ví dụ: Danh sách nhãn hiệu = Brand.all(); và Nhãn hiệu mở rộng từ ActiveModel (ActiveModel có tất cả chức năng), ngay bây giờ tôi phải chuyển Brand.class cho tất cả chức năng để có thể tạo ra một url cho resoruce của tôi, ví dụ: http: //localhost/brands.json để loại bỏ Brand.class khỏi Danh sách thương hiệu = Brand.all (Brand.class) – seriakillaz

Trả lời

4

Đó không phải là cách mà các phương pháp tĩnh hoạt động. Bạn sẽ phải triển khai Derived.foo(), làm bất cứ điều gì đặc biệt với Derived và phương pháp đó sau đó gọi Base.foo(). Nếu bạn thực sự cần thông tin về loại, bạn có thể tạo Base.foo0(Class klass).

Nhưng thành thật mà nói, bất kỳ phương pháp tĩnh nào cần biết loại lớp mà nó được gọi vào có lẽ là một phương thức thể hiện.

+0

Vâng, thực sự đây là cách tôi làm việc xung quanh vấn đề này đầu tiên – seriakillaz

0

Không thể, Derived.foo() sẽ chỉ cần cung cấp mã cho Base.foo().

3

Vâng, người gọi của Derived.foo() biết những gì họ đang kêu gọi, vì vậy bạn có thể thay đổi phương pháp của bạn như sau:

class Base 
{ 
    static void foo(Class<T> calledBy) 
    { 
     // I want to get Derived class here 
     // Derived.class 
    } 
} 

class Derived extends Base 
{ 
} 

Derived.foo(Derived.class); 
1

static phương pháp này không inheritated. Các phương thức tĩnh có cùng chữ ký chỉ có thể ẩn các phương thức tương tự trong lớp cha. Điều này có nghĩa là bạn sẽ không bao giờ thấy kết quả mà bạn có thể muốn - bạn luôn biết chính xác lớp bao quanh. Nó không bao giờ có thể là phương pháp tĩnh bằng cách nào đó "bên trong" một lớp khác. Vì vậy, nó chỉ là không thể sản xuất các kết quả mong muốn. Gọi một phương thức tĩnh từ một lớp con hoặc một cá thể là một ý tưởng tồi vì lý do này vì nó chỉ ẩn lớp thực. (IDE và các công cụ phân tích mã tĩnh có thể đánh dấu hoặc sửa này.)

Nguồn:

Vì vậy, những gì làm việc với các phương pháp di truyền không làm việc với static phương pháp không được kế thừa.

class Base { 
    static void foo() { 
     // Only the static context is available here so you can't get class dynamic class information 
    } 
    void bar() { 
     System.out.println(getClass()); 
    } 
} 
class Derived extends Base { 
} 
class Another extends Base { 
    static void foo() { 
     // No super call possible! 
     // This method hides the static method in the super class, it does not override it. 
    } 
    void bar() { 
     super.bar(); 
    } 
} 

Derived derived = new Derived(); 
derived.bar(); // "class Derived" 
Base base = new Base(); 
base.bar(); // "class Base" 

// These are only "shortcuts" for Base.foo() that all work... 
derived.foo(); // non-static context 
Derived.foo(); // could be hidden by a method with same signature in Derived 
base.foo(); // non-static context 

Base.foo(); // Correct way to call the method 

Another a = new Another(); 
a.foo(); // non-static context 
Another.foo(); 

Ý tưởng hay là ngôn ngữ cho phép điều này? - Hm. Tôi nghĩ rằng nó đang nói rằng các IDE và các công cụ phân tích mã cảnh báo và thậm chí có thể sửa lỗi này một cách tự động.

-1
Derived.foo(); 

này sẽ đi đến foo quy định tại Derived, nếu một người được xác định có:

class Base { 
    static void foo() { 
    System.out.println("Base"); 
    } 
} 

class Der extends Base { 
    static void foo() { 
    System.out.println("Der"); 
    } 
} 

class Check { 
    public static void main(String[] args) { 
    Base.foo(); 
    Der.foo(); 
    } 
} 

Khi tôi chạy nó:

javac -g Check.java && java Check 
Base 
Der 

Vì vậy, câu hỏi của bạn là gì? Nếu bạn yêu cầu mỗi lớp dẫn xuất implement foo không thể thực thi trong Java.

+0

Câu hỏi đặt ra là: Không có 'Derived.foo' nhưng vẫn nhận được 'Derived' như là classname trong' foo', giống như trong các phương thức không tĩnh. –

+0

Bạn có thể đưa ra một ví dụ không? Tôi không nghĩ vậy ... –

+0

Tôi? Xin lỗi, tôi không nghĩ rằng tôi nhận được câu hỏi của bạn. Ví dụ trong câu hỏi cho thấy những gì OP muốn, nhưng điều đó là không thể. –

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