Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从派生类修改变量_C# - Fatal编程技术网

C# 从派生类修改变量

C# 从派生类修改变量,c#,C#,我环顾四周,但找不到我问题的具体答案 这是我感兴趣的抽象类帐户的一部分: public abstract class Account { private decimal balance; public decimal Balance { get { return this.balance; } protected set { if (value &l

我环顾四周,但找不到我问题的具体答案

这是我感兴趣的抽象类帐户的一部分:

 public abstract class Account
 {

 private decimal balance;

 public decimal Balance
    {
        get
        {
            return this.balance;
        }
        protected set
        {
            if (value < 0)
            {
                throw new ArgumentException("Balance can't be negative");
            }
            balance = value;
        }
    }
 protected Account(decimal balance)
    {
        this.Balance = balance;
    }
 }
我的问题是如何在基本Account类中最好地实现Balance属性

我只希望派生类(那些能够取款或存款的帐户)能够修改它(因此是受保护的集合)


我应该将属性设置为protected,而不是public,还是只保护setter?

属性是语法上的糖衣,使访问器更容易实现,但它们仍然编译为常规方法

如果您谈论的是方法而不是属性,您将如何解决您的问题?我猜您会以相同的解决方案结束:修改
余额的内容将受到保护,检索其值将是
public


如果要公开访问
余额
,请将其保留为
公共
,否则请使用
受保护

为什么要使getter受保护?其他类不应该读取余额的任何原因?取决于是否允许公开读取余额。这是一个设计决策问题。如果您想让任何人都能够读取平衡,但只有派生类能够设置平衡,那么您就做对了。保护getter只允许派生类读取balance。也许您应该考虑将
decimal balance{get;}
设置为虚拟属性。您应该考虑允许负余额的
账户。例如抵押贷款账户。
public class DepositAccount : Account, IWithdraw
    {
        public DepositAccount(decimal balance)
            : base(balance)
        {

        }
        public void Withdraw(decimal amount)
        {
            if (amount > this.Balance)
            {
                throw new ArgumentException("Not enough balance!");
            }
            this.Balance -= Balance;
        }
    }