2011-07-04 61 views
21

Tôi đã cố gắng đơn giản hóa tình trạng khó khăn của mình càng nhiều càng tốt. Tôi có ba lớp:Java: Cách truy cập các phương thức từ một lớp khác

Alpha:

public class Alpha { 
    public void DoSomethingAlpha() { 
      cbeta.DoSomethingBeta() //? 
    } 
} 

Beta:

public class Beta { 
    public void DoSomethingBeta() { 
      // Something 
    } 
} 

chính:

public class MainApp { 
    public static void main(String[] args) {   
      Alpha cAlpha = new Alpha(); 
      Beta cBeta = new Beta(); 
    } 
} 

Tôi hy vọng tôi đã không qua đơn giản hóa nó. Câu hỏi của tôi là làm thế nào để truy cập cBeta.DoSomethingBeta() từ một phương thức trong Alpha?

+0

Bạn đã chắc chắn quá đơn giản hóa nó. Alpha không có tham chiếu đến cbeta, DoSomethingBeta được định nghĩa như một hàm tạo, vv Chính xác thì không làm việc cho bạn? – g051051

Trả lời

27

Bạn cần bằng cách nào đó cung cấp cho lớp Alpha một tham chiếu đến cBeta. Có ba cách để làm điều này.

1) Cung cấp cho Alphas Beta trong hàm tạo. Trong lớp Alpha viết:

public class Alpha { 
    private Beta beta; 
    public Alpha(Beta beta) { 
    this.beta = beta; 
    } 

và gọi cAlpha = new Alpha (cBeta) từ chính()

2) cung cấp cho Alpha một mutator đó mang lại cho họ một phiên bản beta.Trong lớp Alpha viết:

public class Alpha { 
    private Beta beta; 
    public void setBeta (Beta newBeta) { 
    this.beta = beta; 
    } 

và gọi cAlpha = new Alpha(); cAlpha.setBeta (beta); từ địa chỉ chính() hoặc

3) có phiên bản beta làm đối số cho doSomethingAlpha. trong lớp Alpha viết:

public void DoSomethingAlpha(Beta cBeta) { 
     cbeta.DoSomethingBeta() 
} 

Chiến lược nào bạn sử dụng tùy thuộc vào một vài điều. Nếu bạn muốn mọi Alpha đều có bản Beta, hãy sử dụng số 1. Nếu bạn chỉ muốn một số Alpha có Beta, nhưng bạn muốn họ giữ Betas vô thời hạn, hãy sử dụng số 2. Nếu bạn muốn Alphas chỉ xử lý Betas trong khi bạn đang gọi doSomethingAlpha, sử dụng số 3. Phạm vi biến là phức tạp lúc đầu, nhưng nó sẽ dễ dàng hơn khi bạn bị treo nó. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nhiều hơn nữa!

+0

Cảm ơn, tôi không nghĩ rằng người thứ ba sẽ làm việc với trường hợp của tôi, nhưng số 1 sẽ hoạt động. Tôi nên đã đặt này, nhưng cả hai "Alpha" và "Beta" tạo JFrames khác nhau. "Alpha" có một hộp kiểm, mà "Beta" cần phải biết nếu nó được kiểm tra. – co757

0

Bạn có thể cần phải tạo ra một đối tượng kiểu Beta trong lớp Alpha hoặc phương pháp của nó

Giống như bạn làm ở đây trong chính Beta cBeta = new Beta();

Nếu bạn muốn sử dụng biến bạn tạo ra trong chính bạn thì bạn phải phân tích nó để cAlpha như một tham số bằng cách làm cho các nhà xây dựng cái nhìn Alpha như

public class Alpha 
{ 

    Beta localInstance; 

    public Alpha(Beta _beta) 
    { 
     localInstance = _beta; 
    } 


    public void DoSomethingAlpha() 
    { 
      localInstance.DoSomethingAlpha();  
    } 
} 
0

Có lẽ bạn cần một số dependency injection

public class Alpha { 

    private Beta cbeta; 

    public Alpha(Beta beta) { 
     this.cbeta = beta; 
    } 

    public void DoSomethingAlpha() { 
     this.cbeta.DoSomethingBeta(); 
    } 
} 

và sau đó

Alpha cAlpha = new Alpha(new Beta()); 
14

Phương pháp 1:

Nếu phương pháp DoSomethingBeta là tĩnh bạn chỉ cần gọi:

Beta.DoSomethingBeta(); 

Cách 2:

Nếu Alpha kéo dài từ Beta bạn có thể gọi DoSomethingBeta() trực tiếp.

public class Alpha extends Beta{ 
    public void DoSomethingAlpha() { 
      DoSomethingBeta(); //? 
    } 
} 

Phương pháp 3:

Ngoài ra bạn cần phải có quyền truy cập vào một thể hiện của Beta để gọi các phương pháp từ nó.

public class Alpha { 
    public void DoSomethingAlpha() { 
      Beta cbeta = new Beta(); 
      cbeta.DoSomethingBeta(); //? 
    } 
} 

Ngẫu nhiên là bài tập về nhà này?

0
public class WeatherResponse { 

private int cod; 
private String base; 
private Weather main; 

public int getCod(){ 
    return this.cod; 
} 

public void setCod(int cod){ 
    this.cod = cod; 
} 

public String getBase(){ 
    return base; 
} 

public void setBase(String base){ 
    this.base = base; 
} 

public Weather getWeather() { 
    return main; 
} 

// default constructor, getters and setters 
} 

lớp khác

public class Weather { 

private int id; 
private String main; 
private String description; 

public String getMain(){ 
    return main; 
} 

public void setMain(String main){ 
    this.main = main; 
} 

public String getDescription(){ 
    return description; 
} 

public void setDescription(String description){ 
    this.description = description; 
} 

// default constructor, getters and setters 
} 

// truy cập phương pháp
// thành công!

Log.i("App", weatherResponse.getBase()); 
    Log.i("App", weatherResponse.getWeather().getMain()); 
    Log.i("App", weatherResponse.getWeather().getDescription()); 
0

Tôi có một giải pháp khác. Nếu Alpha và Beta là lớp phụ duy nhất của bạn thì tại sao không tạo biến tĩnh với hình ảnh của lớp.

Giống như trong Alpha lớp:

public class Alpha{ 
     public static Alpha alpha; 
     public Alpha(){ 
       this.alpha = this; 
} 

Bây giờ bạn có thể gọi hàm trong lớp Beta bằng cách chỉ sử dụng những dòng này:

new Alpha(); 
Alpha.alpha.DoSomethingAlpha(); 
Các vấn đề liên quan