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



好吧,我正在做一个有抽象public abstract bool IsFull { get; }的项目,这就是学校希望我设置它的方式。我一直在想办法解决这个问题,但我做不到。我有一些文件不确定是否要全部发布。所以在我的班级里,它是从另一个班级继承来的。所以当我从程序cs类启动它时,我无法用简单的IsFull = true来更改布尔值。我尝试了IsFull.Equal(true);,但读到它只是一个比较属性。我会显示我的代码。记住,这对我来说是100%新鲜的,所以如果你问我为什么不这样做,答案是我从来没有被教过,哈哈。那么,有没有一种方法可以在甜食类中覆盖它?

我的忍者类

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);
}
}

我继承的班级甜食

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());
}
}
}
}

根据我的理解,IsFull属性可以简单地提供返回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();
}

根据语言设计,你根本做不到。你不能使你的子类"更宽容";而不是父类。如果要分配IsFull属性,则必须通过构造函数将其分配到SweetTooth类中。一般来说,如果你用privatesetter设置一个属性,是因为你想在内部管理它的状态,而不让客户端代码来处理它

然后,根据以下内容更改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

最新更新