2012-01-30 7 views
10

Có thể cho phương thức a.doStuff() để in "B đã làm" mà không chỉnh sửa lớp A không? Nếu vậy, tôi sẽ làm như thế nào?Gọi phương thức lớp con từ cha mẹ

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 

Tôi đang điều chỉnh trò chơi hơi nước, Terraria. Và tôi không muốn dịch ngược và biên dịch lại tất cả bởi vì nó sẽ vặn với hơi nước. Chương trình của tôi 'tiêm' vào Terraria qua XNA. Tôi có thể sử dụng các phương thức update() và draw() từ XNA để mod một số thứ. Nhưng nó khá hạn chế. Tôi không thể ghi đè lên các phương thức cơ bản để mod nhiều thứ hơn (ví dụ worldgen).

Trả lời

13

Có, nếu bạn khai báo doStuffvirtual trong A và sau đó override trong B.

class A 
{ 
    public virtual void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

Vì A.doStuff chỉ ở đó để được ghi đè, nó phải trừu tượng hơn là ảo. –

2

Vì B có hiệu quả A thông qua kế thừa và phương thức bị quá tải.

A a = new B(); 
a.doStuff(); 
+2

tất nhiên nó có thể được thực hiện bởi ảo và ghi đè, nhưng đây là cách duy nhất để làm điều đó mà không thay đổi A theo yêu cầu OP –

+0

Cảm ơn, nhưng tôi cũng không thể làm điều đó. Có lẽ tôi nên làm rõ điều này trong OP; Tôi đang mod một trò chơi hơi nước, Terraria. Và tôi không muốn dịch ngược và biên dịch lại tất cả bởi vì nó sẽ vặn với hơi nước. Chương trình của tôi 'tiêm' vào Terraria qua XNA. Tôi có thể sử dụng các phương thức update() và draw() từ XNA để mod một số thứ. Nhưng nó khá hạn chế. Tôi không thể ghi đè lên các phương thức cơ bản để mod nhiều thứ hơn (ví dụ worldgen). – user1178494

+0

@ user1178494 xem câu trả lời cập nhật của tôi với việc sử dụng từ khóa mới có thể hữu ích. – VS1

0

Mã cho hạng A & B bạn đã gửi anyways sẽ tạo ra dưới đây cảnh báo trình biên dịch và sẽ yêu cầu sử dụng từ khoá new trên lớp B, mặc dù nó sẽ biên dịch: Các từ khóa mới được yêu cầu trên ' B.doStuff()' bởi vì nó giấu thành viên được thừa hưởng 'A.doStuff()'

Sử dụng method hiding cùng với newvirtual từ khóa trong Mapper lớp và lớp B như sau:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper a = new B(); //notice this line 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class Mapper : A 
{ 
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation 
    { 
     Console.WriteLine("Mapper did stuff"); 
    } 
} 

class B : Mapper 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

Cảm ơn, nhưng điều này vẫn sẽ in "A đã làm công cụ" khi gọi a.doStuff(). – user1178494

+0

@ user1178494 Tôi đã cập nhật câu trả lời của mình, xin hãy thử và chú ý đến việc sử dụng lớp Mapper (hòa giải) ở giữa các lớp A và B, vui lòng xem nó có giải quyết được vấn đề của bạn hay không .. – VS1

+0

Nó vẫn không hoạt động, thật đáng buồn. Cảm ơn một lần nữa vì đã giúp tôi. – user1178494