Tôi nhận thấy rằng bạn có thể bắt chước không gian tên c # như thế này;
namespace ABC_Maths{
class POINT2{};
class Complex{};
}
namespace ABC_Maths_Conversion{
ABC_MATHS::Complex ComplexFromPOINT2(ABC_MATHS::POINT2)
{return new ABC_MATHS::Complex();}
ABC_MATHS::POINT4 POINT2FromComplex(ABC_MATHS::COMPLEX)
{return new ABC_MATHS::POINT2();}
}
namespace ABC
{
}
Nhưng mã có vẻ không được gọn gàng cho lắm. và tôi mong đợi sẽ sử dụng lâu dài
Tốt hơn là lồng càng nhiều chức năng vào các lớp như
namespace ABC{
class Maths{
public:
class POINT2{};
class Complex:POINT2{};
class Conversion{
public:
static Maths.Complex ComplexFromPOINT2(MATHS.POINT2 p)
{return new MATHS.Complex();}
static MATHS.POINT2 POINT2FromComplex(MATHS.COMPLEX p)
{return new ABC::MATHS.POINT2();}
}
Và điều đó vẫn còn hơi dài. nhưng không cảm thấy một chút OO.
Và nghe cách nó có vẻ được thực hiện tốt nhất
namespace ABC
{
class POINT2{};
class Complex:POINT2{};
Complex ComplexFromPOINT2(POINT2 p){return new Complex();}
POINT2 POINT2FromComplex(Complex){return new POINT2();}
}
nghe cách sử dụng sẽ trông như thế nào
int main()
{
ABC_Maths::Complex p = ABC_Maths_Conversion::ComplexFromPOINT2(new ABC_MATHS::POINT2());
ABC.Maths.Complex p = ABC.Maths.Conversion.ComplexFromPOINT2(new ABC.Maths.POINT2());
Maths.Complex p = Maths.Conversion.ComplexFromPOINT2(new Maths.POINT2());
ABC::Complex p = ABC::ComplexFromPOINT2(new ABC::POINT2());
}
Thật thú vị khi tìm hiểu lý do tại sao tôi không bao giờ sử dụng không gian tên c ++ như tôi làm với c #. Nó sẽ quá dài và sẽ không bao giờ hoạt động giống như không gian tên c #.
cách sử dụng tốt nhất cho không gian tên trong c ++ là ngăn không cho hàm super cout của tôi (nó hoạt động mỗi khi nó được gọi) khỏi bị lẫn với hàm std :: cout (ít ấn tượng hơn).
Chỉ vì c # và c ++ có không gian tên, không có nghĩa là không gian tên có nghĩa giống nhau. chúng khác nhau nhưng giống nhau. Ý tưởng cho không gian tên c # hẳn đến từ không gian tên c ++. ai đó chắc hẳn đã thấy những gì một thứ tương tự nhưng khác biệt có thể làm, và không còn đủ trí tưởng tượng để đặt cho nó cái tên ban đầu như "ClassPath", điều này sẽ có ý nghĩa hơn khi nó là một đường dẫn đến các lớp thay vì cung cấp đặt tên cho không gian trong đó mỗi không gian có thể có các tên giống nhau
tôi hi vọng điêu nay se giup được ai đo
Tôi quên nói rằng tất cả những cách này đều hợp lệ và việc sử dụng vừa phải hai cách đầu tiên có thể được kết hợp với cách thứ ba để tạo ra một thư viện có ý nghĩa (không phải ví dụ tuyệt vời)
_INT::POINT2{}
và
_DOUBLE::POINT2{}
vì vậy bạn có thể thay đổi mức độ chính xác bằng cách sử dụng
#define PREC _DOUBLE
và sau đó tạo một phiên bản của PREC :: POINT2 cho POINT2 chính xác gấp đôi
Đó không phải là điều dễ dàng thực hiện với không gian tên c # hoặc java
rõ ràng đó chỉ là một ví dụ. Hãy suy nghĩ về cách sử dụng đọc.
namespace tier1::tier2::tier3
.