我有一个 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
属性赋值,就得通过构造函数赋值给SweetTooth
class。通常如果你设置一个 属性 和 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();
}
好的,我正在做一个有抽象的项目 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
属性赋值,就得通过构造函数赋值给SweetTooth
class。通常如果你设置一个 属性 和 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();
}