删除调用类/方法的对象

邦德拉

知名会员
已加入
2020年10月24日
留言内容
69
编程经验
Beginner
不知道该帖子的标题是否描述了我想要实现的目标。
但我尝试在下面解释。

在玩具课上's LowerQuality方法,如果质量为0,我想从中删除当前动物玩具:
abstract class Toy
    {
        public int 质量 { get; set; } = 10;

        public virtual int LowerQuality(int inputQuality)
        {
            int calcQuality = 质量 - inputQuality;
            质量 = calcQuality;
            Console.WriteLine(" Play has finished!");
            if (Quality <= 0)
            {
                质量 = 0;
                Console.WriteLine($" 质量 of the {Name} has decreased with " + inputQuality + " and is now waste and removed from toys list");
                Petowner.Pets[???].Toys.Remove(this); // 1. How can I tell what index of animal that actually call this method?
                Petowner.Pets[0].Toys.Remove(this); // 2. This will work since the animal is specified by a fixed index which needs to be dynamic however
            }
            else
            {
                Console.WriteLine($" 质量 of the {Name} has decreased with " + inputQuality + " and is now " + 质量);
            }
            return 质量;
        }
    }

The object that'在Toy对象中调用方法LowerQuality():
    class Cat : Animal
    {
        public override 虚空 Interact(Toy toy)
        {
            if (toy is Bone bone)
                quality = 1;

            else if (toy is Ball ball)
                quality = 4;

            toy.LowerQuality(quality); // In this case the cat calls the LowerQuality() method
   
            // Having the code like this i.e. in the cat object makes it possible to remove the current toy item. But having it like this also forces me to have duplicated code in every animal object...
            //if (qualityCheck == 0)
            //{
            //    Toys.Remove(toy);
            //}
        }
    }
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我认为质量并不是正确的词。什么 @邦德拉 试图模拟的是,每次动物玩玩具时,它就会越来越破旧。最终,当玩具完全磨损时,想要玩具"destroyed"并有效地将其带离宠物。也许称之为耐用性。也许称之为生命值。

就我个人而言,我认为您正在错误地解决它。你正在打破 得墨meter耳定律。正如您所发现的,玩具如何将自身从包含它的列表中删除?

正确的做法是先通过更新所有玩具的磨损,然后再通过所有玩具检查其寿命点。如果生命点降低到零,则从宠物玩具列表中删除玩具。由于第二遍遍历所有玩具,因此它具有容纳所有玩具的容器。那应该有能力从容器中取出东西。

离题:此代码:
C#:
if (toy is Bone bone)
    quality = 1;

else if (toy is Ball ball)
    quality = 4;
是一种代码气味。每当检查对象的类型以确定对象的类型,然后根据该类型执行不同的行为时,都暗示您应该使用多态。
 

邦德拉

知名会员
已加入
2020年10月24日
留言内容
69
编程经验
Beginner
当涉及到多态性时,这确实令人沮丧。我白天看过视频,但还没有充分发挥它的潜力。因此,以多态方式制作的上述示例将不胜感激!
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
当涉及到多态性时,这确实令人沮丧。我白天看过视频,但还没有充分发挥它的潜力。因此,以多态方式制作的上述示例将不胜感激!
C#:
class Toy
{
    public virtual int GetDamageByPet() => 0;
}

class Bone : Toy
{
    public override int GetDamageByPet() => 1;
}

class Ball : Toy
{
    public override int GetDamageByPet() => 4;
}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
啊。这使事情变得更有趣。我怀疑很多人会采用不同的方法。我建议就该主题为玩具造成的损坏启动其他线程,然后保留有关如何将玩具移除后的当前线程的当前线程。"destroyed".
 
最佳 底部