Xét đoạn code mẫu sau:Ưu và nhược điểm của thuộc tính 'mới' trong C#/.Net?
// delivery strategies
public abstract class DeliveryStrategy { ... }
public class ParcelDelivery : DeliveryStrategy { ... }
public class ShippingContainer : DeliveryStrategy { ... }
và lớp mẫu theo thứ tự sau đây:
// order (base) class
public abstract class Order
{
private DeliveryStrategy delivery;
protected Order(DeliveryStrategy delivery)
{
this.delivery = delivery;
}
public DeliveryStrategy Delivery
{
get { return delivery; }
protected set { delivery = value; }
}
}
Khi tôi lấy được một loại mới của lớp trật tự, nó sẽ thừa hưởng tài sản Cung cấp các loại DeliveryStrategy.
Bây giờ, khi nó được đưa ra rằng CustomerOrders phải được giao sử dụng chiến lược ParcelDelivery, chúng tôi có thể xem xét 'mới' ing thuộc tính giao hàng trong lớp CustomerOrder:
public class CustomerOrder : Order
{
public CustomerOrder()
: base(new ParcelDelivery())
{ }
// 'new' Delivery property
public new ParcelDelivery Delivery
{
get { return base.Delivery as ParcelDelivery; }
set { base.Delivery = value; }
}
}
(Các CustomerOrder rõ ràng là cần phải đảm bảo rằng tương thích (đa hình) với Đặt hàng)
Điều này cho phép sử dụng trực tiếp chiến lược Chuyển phát bưu kiện trên CustomerOrder mà không cần phải truyền.
Bạn có cân nhắc sử dụng mẫu này không? tại sao tại sao không?
Cập nhật: tôi đã đưa ra mẫu này, thay vì sử dụng Generics, vì tôi muốn sử dụng tính năng này cho nhiều thuộc tính. Tôi không muốn sử dụng các đối số kiểu chung cho tất cả các thuộc tính này
Miễn là phương pháp che bóng của bạn không có điều kiện tiên quyết chặt chẽ hơn và không có điều kiện dự phòng yếu hơn, tôi nghĩ thực hành này là hoàn toàn có thể chấp nhận được. –
Trong trường hợp đầu tiên, tại sao bạn cần phải cast DeliveryStrategy? Điểm của việc sử dụng mô hình chiến lược là các hành vi thực hiện một giao diện, và do đó có tất cả các phương thức giống nhau, do đó, không cần phải được đúc. –