Tôi muốn tránh sử dụng các lớp được gắn thẻ và các khối if-else hoặc câu lệnh chuyển đổi và sử dụng đa hình với phân cấp lớp thay vào đó, mà tôi tin là thực hành tốt hơn.Tạo đối tượng và đa hình
Ví dụ, một cái gì đó giống như dưới đây, nơi mà sự lựa chọn của phương pháp thực hiện là phụ thuộc chỉ có một lĩnh vực của một đối tượng loại Actor.
switch(actor.getTagField())
{
case 1: actor.act1(); break;
case 2: actor.act2(); break;
[...]
}
sẽ trở thành
actor.act();
và phương pháp hành động sẽ được ghi đè trong các lớp con của diễn viên.
Tuy nhiên, cách rõ ràng nhất để quyết định trong thời gian chạy mà lớp con để nhanh chóng trông hết sức tương tự với bản gốc:
Actor newActor(int type)
{
switch(type)
{
case 1: return new Actor1();
case 2: return new Actor2();
[...]
}
}
nên nó có vẻ như không có gì thực sự đã đạt được; logic đã được di chuyển.
Cách tốt hơn để làm điều này là gì? Cách duy nhất tôi có thể đưa ra liên quan đến việc thực hiện một lớp nhà máy cho mỗi phân lớp của Actor, nhưng điều này có vẻ khá cồng kềnh cho một vấn đề đơn giản như vậy.
Tôi có thấy quá mức này không? Nó chỉ có vẻ như không có điểm làm cho sự thay đổi ban đầu nếu tôi chỉ làm khá nhiều điều tương tự ở nơi khác.
Xin lỗi, để làm rõ, tôi muốn chọn phân lớp để khởi tạo trong thời gian chạy, không phải lúc biên dịch như trong ví dụ của bạn. Điều này đòi hỏi một chuyển đổi lớn hoặc khối khác nếu tôi muốn tránh. Tôi bắt đầu nghĩ rằng điều đó là không cần thiết vì nó sẽ chỉ cần một lần khi sáng tạo. – flowsnake
Hmm..chính hãng nhà máy có ít việc phải làm với biên dịch thời gian chạy/biên dịch mỗi lần, thay vì trách nhiệm và kiểm soát việc tạo ra các diễn viên. Ví dụ, nếu việc tạo ra các diễn viên ở trên xảy ra trong một sự kiện, nó sẽ không phải là thời gian chạy? –
Những gì bạn đang làm là "quyết định" để tập trung việc tạo ra các diễn viên .. bạn muốn các diễn viên đến từ một nơi, trong trường hợp đó ... bạn không thể đi vòng quanh ... bởi vì đó là quyết định người dùng cuối cùng. –