2009-08-14 43 views
5

Tôi có một đống thú vị của hội tôi muốn đặt lại với nhau:C# và C++ lớp thừa kế xen

  1. Common hội (C# hoặc C++ - CLI)

    public class MyBase 
    { 
    public void MethodA() 
    { ... } 
    private void MethodB() 
    { ... } 
    protected virtual MethodC() 
    { ... } 
    } 
    
  2. Kiểm tra Mã Assemblies (tất cả C++ - CLI)

    public class MySpecific : public MyBase{ 
    protected: override MethodC(); 
    }; 
    
  3. Thử nghiệm mô phỏng (C#)

    MySpecific obj = new MySpecific(); 
    obj.MethodC(); 
    

Trong khi lắp ráp 1 có thể là C++ - CLI để giữ cho mọi thứ đơn giản hơn, tôi thực sự muốn giữ lắp ráp 3 trong C#. Điều này phần lớn là một bài tập để xem liệu thừa kế có thể được thực hiện theo một trong hai hướng hay không, nhưng tôi cũng có một trường hợp thế giới thực trong đó ngăn xếp này hữu ích. Vấn đề đầu tiên tôi thấy là cụm C++ - CLI không biên dịch vì nó không nhận ra MyBase như một lớp, mặc dù tôi có tham chiếu đến assembly 1 và trông giống như không gian tên thích hợp.

Làm cách nào để viết các lớp học có thể sử dụng ngôn ngữ?

Trả lời

4

Tôi nghĩ rằng bạn phải khai báo MySpecific như là một lớp quản lý như thế này:

public ref class MySpecific : public MyBase { ... } 

Xem CLI/C++ tài liệu hướng dẫn để biết chi tiết. Bạn sẽ không thể sử dụng mã C++ cũ mà không sửa đổi, nhưng tôi nghĩ rằng mọi thứ bạn có trong tâm trí sẽ là có thể.

1

Điều này sẽ hoạt động tốt, nhưng bạn sẽ cần phải sử dụng cú pháp C++/CLI, nếu bạn đang làm việc với các loại được quản lý (ví dụ: kế thừa từ một lớp C#). Vì vậy, trong trường hợp này, mục trong 2. sẽ trông giống như sau:

public ref class MySpecific : public MyBase { ... } 

Đảm bảo rằng tệp được biên dịch với/clr là tốt.

Đây là tutorial describing inheritance in C++/CLI.

+1

Làm cách nào để có trình biên dịch C++ xem MyBase? Tôi tiếp tục nhận được "C2504: 'Mybase': lớp cơ sở chưa được xác định" – Foozinator

+0

Đảm bảo rằng nó được thêm làm tham chiếu và bạn đã biên tập tệp này bằng/clr. Ngoài ra, hãy đảm bảo bạn đang làm việc với (hoặc sử dụng) các không gian tên thích hợp. Có vẻ như bạn không ở trong một phần sử dụng cùng một không gian tên. Bạn có thể đủ điều kiện MyBase - tức là: lớp ref công khai MySpecific: public MyNamespace :: MyBase {...} –

3

Tìm thấy câu trả lời:

`#using "..\common\bin\debug\common.dll"` 

đó, ngoài việc chuyển đổi/clr (C++ cạnh cần được mananged) dường như được làm việc, cho đến nay.