2013-04-30 53 views
6

Tôi có một phương pháp trong baseclass của tôi mà trả về một bool và tôi muốn bool đó để xác định những gì xảy ra với cùng một phương pháp ghi đè trong lớp dẫn xuất của tôi.Sử dụng giá trị trả về của phương thức baseclass?

Base:

public bool Debt(double bal) 
    { 
     double deb = 0; 
     bool worked; 

     if (deb > bal) 
     { 
      Console.WriteLine("Debit amount exceeds the account balance – withdraw cancelled"); 
      worked = false; 
     } 
     else 

     bal = bal - deb; 
     worked = true; 

     return worked; 
    } 

nguồn gốc

public override void Debt(double bal) 
    { 
     // if worked is true do something 

    } 

Lưu ý rằng bal xuất phát từ một constructor tôi thực hiện trước đó

+1

Hãy chắc chắn rằng phương pháp lớp cơ sở của bạn là ảo: 'công bool ảo Deb (bal kép)' hoặc lớp được thừa kế của bạn sẽ chỉ ẩn nó. Chỉ là một lưu ý phụ. –

+4

Ngoài ra kiểu giá trị trả lại phải khớp, nếu không bạn sẽ gặp lỗi trình biên dịch, '' .Derived.Debt (double) ': kiểu trả về phải là' bool 'để khớp thành viên ghi đè' .Base.Debt (double) ''. –

Trả lời

10

Bạn có thể gọi phương thức lớp cơ sở sử dụng base keyword:

public override void Debt(double bal) 
{ 
    if(base.Debt(bal)) 
     DoSomething(); 

} 

Như đã nêu trong các chú thích ở trên, bạn cần đảm bảo rằng có một phương thức ảo có cùng chữ ký (kiểu trả về và các tham số) trong lớp cơ sở hoặc loại bỏ từ khóa ghi đè từ lớp khởi tạo.

+1

Có thể là tốt nhất để đánh dấu khu vực sau 'if' và làm công cụ của bạn ở đó, thay vì gọi một phương thức khác để thực hiện điều đó. Tại sao làm cho cuộc gọi của bạn ngăn xếp sâu hơn nó phải được? – Jeff

+0

@ Jeff - Tôi đặt phương thức gọi hoàn toàn để chỉ ra rằng có điều gì đó sẽ xảy ra ở đó. Nó cũng có thể là câu lệnh nội tuyến. – PHeiberg

+0

Tôi thấy những gì bạn đang nhận được ngoại trừ không có cách nào để cho biết kết quả là đúng hay sai – TheAce

2
if(base.Debt(bal)){ 
    // do A 
}else{ 
    // do B 
} 

base là lớp cơ sở. Vì vậy, base.X đề cập đến X trong lớp cơ sở.

2

Gọi phương pháp base:

public override void Debt(double bal) 
{ 
    var worked = base.Debt(bal); 
    //Do your stuff 
} 
1

Như một số người khác đã đề cập, bạn có thể sử dụng base.Debt(bal) gọi vào phương pháp lớp cơ sở của bạn. Tôi cũng nhận thấy rằng phương thức lớp cơ sở của bạn không được khai báo là ảo. Các phương thức C# KHÔNG phải là ảo theo mặc định, do đó bạn sẽ không ghi đè nó trong một lớp dẫn xuất trừ khi bạn đã chỉ rõ nó là ảo trong lớp cơ sở.

//Base Class 
class Foo 
{ 
    public virtual bool DoSomething() 
    { 
     return true; 
    } 
} 

// Derived Class 
class Bar : Foo 
{ 
    public override bool DoSomething() 
    { 
     if (base.DoSomething()) 
     { 
      // base.DoSomething() returned true 
     } 
     else 
     { 
      // base.DoSomething() returned false 
     } 
    } 
} 

Here's gì MSDN đã nói về phương pháp ảo

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