嵌套类-对所有人公开,仅对外部类设置

时间:2019-03-13 11:19:10

标签: c#

如何设置修饰符?我想让嵌套类的“ get”对所有人开放,只为外部类设置? 错误:

  

索引器'Cart.CartItem.Quantity'的属性不能用于   这种情况是因为set访问器不可访问   'Cart.CartItem.CartItem(Guid itemId,字符串名称,十进制价格,整数   数量)由于其保护级别而无法访问

代码:

public class Cart
{
    public List<CartItem> CartItems { get; private set; }
    public int TotalQuantity => CartItems.Sum(x => x.Quantity);
    public decimal TotalPrice => CartItems.Sum(x => x.Price * x.Quantity);

    public Cart()
    {
        CartItems = new List<CartItem>();
    }

    public void AddItem(Guid itemId, string name, decimal price)
    {
        CartItem cartItem = CartItems.Find(x => x.ItemId == itemId);

        if (cartItem != null)
        {
            cartItem.Quantity += 1;
        }
        else
        {
            CartItems.Add(new CartItem(itemId, name, price, 1));
        }
    }

    public class CartItem
    {
        public Guid ItemId { get; private set; }
        public string Name { get; private set; }
        public int Quantity { get; private set; }
        public decimal Price { get; private set; }

        private CartItem(Guid itemId, string name, decimal price, int quantity)
        {
            ItemId = itemId;
            Name = name;
            Price = price;
            Quantity = quantity;            
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您不太了解使用嵌套类型的原因。

  

嵌套类型可以访问封闭类型中定义的私有字段

查看有关Dos and Donts

的链接
  

X AVOID公开暴露的嵌套类型。唯一的例外是,仅在子类化或其他高级自定义方案等极少数情况下才需要声明嵌套类型的变量。

     

如果可能在包含类型之外引用该类型,则不要使用嵌套类型。

因此,正确的方法是保持类的私有性和成员的公开性,因此嵌套类型的成员和字段只能由封闭类型访问

public class Cart {
    List<CartItem> CartItems { get; set; }
    public int TotalQuantity => CartItems.Sum(x => x.Quantity);
    public decimal TotalPrice => CartItems.Sum(x => x.Price * x.Quantity);

    public Cart() {
        CartItems = new List<CartItem>();
    }

    public void AddItem(Guid itemId, string name, decimal price) {
        CartItem cartItem = CartItems.Find(x => x.ItemId == itemId);

        if (cartItem != null) {
            cartItem.Quantity += 1;
        } else {
            CartItems.Add(new CartItem(itemId, name, price, 1));
        }
    }

    class CartItem {
        public Guid ItemId { get; set; }
        public string Name { get; set; }
        public int Quantity { get; set; }
        public decimal Price { get; set; }

        public CartItem(Guid itemId, string name, decimal price, int quantity) {
            ItemId = itemId;
            Name = name;
            Price = price;
            Quantity = quantity;
        }
    }
}

class Program {
    static void Main(string[] args) {
        var test = new Cart.CartItem(Guid.Empty, "", 0.0m, 10); // Error CS0122  'Cart.CartItem' is inaccessible due to its protection level 


    }
}