我有一个 C# 控制台项目,我正在使用 agetter 而没有 setter

I have a C# console project I am working on With agetter and no setter

好的,我正在做一个有抽象的项目 public abstract bool IsFull { get; } 这就是学校要我设置它的方式。我试图找出解决办法,但我做不到。我有一些文件不确定是否要将它们全部 post。所以在我的 class 中它是从另一个 class 继承的。所以当我从程序 cs class 启动它时,我无法用简单的 IsFull = true 来改变布尔值。我试过 IsFull.Equal(true); 但读到的只是一个比较属性。我会展示我的代码。请记住,这对我来说是 100% 新的,所以如果你问我为什么不这样做,答案是我从来没有被教导过,哈哈。 那么有没有一种方法可以在 sweettooth class?

中覆盖它

我的忍者class

using System.Collections.Generic;
using IronNinja.Interfaces;

namespace IronNinja.Models
{
    abstract class Ninja
    {
        protected int calorieIntake;
        public List<IConsumable> ConsumptionHistory;
        public Ninja()
        {
            calorieIntake = 0;
            ConsumptionHistory = new List<IConsumable>();
        }
        public abstract bool IsFull { get; }
        public abstract void Consume(IConsumable item);
    }
}

我继承了class甜牙

using IronNinja.Interfaces;

namespace IronNinja.Models
{
    class SweetTooth : Ninja
    {
        public string Name;
        public SweetTooth(string name)
        {
            Name = name;
        }
        public override bool IsFull { get; }
        public override void Consume(IConsumable item)
        {

            // provide override for Consume
            int sweet = 0;
            if (calorieIntake >= 1500)
            {
                
            }
            else
            {
                if (item.IsSweet)
                {
                    sweet = 10;
                }
                ConsumptionHistory.Add(item);
                calorieIntake += item.Calories + sweet;
            }
            item.GetInfo();
        }
    }
}

最后是我的程序 .cs 文件

using System;
using IronNinja.Models;

namespace IronNinja
{
    class Program
    {
        static void Main(string[] args)
        {
            Buffet hungryJack = new Buffet();
            SweetTooth Albert = new SweetTooth("Alby");
            while (!Albert.IsFull)
            {
                Albert.Consume(hungryJack.Serve());
            }
            foreach (Food item in Albert.ConsumptionHistory)
            {
                Console.WriteLine(item.Name);
                System.Console.WriteLine(item.GetInfo());
            }
        }
    }
}

根据语言设计,您根本做不到。你不能让你的子class比父class“更宽容”。 如果要给IsFull属性赋值,就得通过构造函数赋值给SweetToothclass。通常如果你设置一个 属性 和 private setter 是因为你想在内部管理它的状态而不是让客户端代码来处理它。

然后,按以下方式更改 SweetTooth 构造函数:

public SweetTooth(string name, bool isFull)
        {
            Name = name;
            IsFull = isFull;
        }

另一种方法是添加一个私人支持字段,但同样您只能在内部编辑它:

private bool _isFull;
public override bool IsFull => _isFull;

Equal 方法比较两个值。在您的特定情况下,您调用了 bool.Equals(bool) 重载,它作为 Albert.IsFull == true

根据我的理解,IsFull 属性 可以简单地提供 return SweetTooth 是否已满的逻辑:

public override bool IsFull => calorieIntake >= 1500;

然后在SweetTooth.Consume你会在消耗更多消耗品之前检查它们是否已满:

public override void Consume(IConsumable item)
{

    // provide override for Consume
    int sweet = 0;
    if (IsFull)
    {
        return;
    }
    else
    {
        if (item.IsSweet)
        {
            sweet = 10;
        }
        ConsumptionHistory.Add(item);
        calorieIntake += item.Calories + sweet;
    }
    item.GetInfo();
}