【问题标题】:Assets object created from static method从静态方法创建的资产对象
【发布时间】:2019-02-26 09:08:18
【问题描述】:

目前我正在尝试使用从静态方法创建的对象,但它没有发生。我相信我做错了什么,但我不知道是什么。这是我用来创建对象的代码,此代码位于单独的类中,假设它的名称是 CrusadersFactory.cs:

//Method for creating crusader Nate
public static void CreateNate(string name, int level, int health, int damage)
{
    Nate NateDragon = new Nate(name, level, health, damage);
    //Print the info for the new object NateDragon
    Console.WriteLine(NateDragon.name + " " + NateDragon.level + " "  + NateDragon.health + " " + NateDragon.damage);
}

这是我尝试使用该对象的方式,此代码在 Program.cs 中:

CrusadersFactory.CreateNate("Nate", 100, 200, 300); //This works in order to create Nate, but It gives error if i try Console.WriteLin(CrusadersFactory.NateDragon.name)
Console.WriteLine("Nate's health is {0}", CrusadersFactory.NateDragon.health);

提前感谢您的回答!

【问题讨论】:

  • 你的方法没有返回任何东西,NateDragon 没有存储在任何地方——它根本无法在CreateNate之外访问
  • 但它没有发生。”它不是对问题的技术描述

标签: c# oop static-methods


【解决方案1】:

因为您可以在没有编译器错误的情况下调用它:

CrusadersFactory.NateDragon.health

这意味着您确实在您的CrusadersFactory 中创建了一个静态NateDragon 属性。但是,您从未向此属性分配任何内容

public static void CreateNate(string name, int level, int health, int damage)
{
    Nate NateDragon = new Nate(name, level, health, damage);
}

您在这里所做的事情被声明并分配了一个局部变量。该变量只存在于CreateNate方法的作用域内,不存在于它之外。

你应该做的是将你创建的对象分配给你想要存储它的静态属性:

public static void CreateNate(string name, int level, int health, int damage)
{
    CrusadersFactory.NateDragon = new Nate(name, level, health, damage);
}

由于CreateNate 方法也是CrusadersFactory 的一部分,您可以将其缩短为:

public static void CreateNate(string name, int level, int health, int damage)
{
    NateDragon = new Nate(name, level, health, damage);
}

非常简单地说,当您使用Nate NateDragon = ... 时,您声明了一个新变量,而不是访问您已经在CrusadersFactory 类中声明的静态类属性NateDragon

【讨论】:

    【解决方案2】:

    您的方法具有 void 返回类型(不返回任何值)。您应该将其更改为返回类型 Nate

    public static Nate CreateNate(string name, int level, int health, int damage)
    {
        var nate = new Nate(name, level, health, damage);
        //Print the info for the new object NateDragon
        Console.WriteLine(nate.name + " " + nate.level + " "  +  nate.health + " " + nate.damage);
        return nate;
    }
    

    你的使用例子可以变成:

    var nate = CrusadersFactory.CreateNate("Nate", 100, 200, 300);
    Console.WriteLine("Nate's health is {0}", nate.health);
    

    【讨论】:

    • 看看 OP 的预期使用示例,他不是试图返回一个对象,而是assign一个对象到一个静态属性。
    • @Flater 当然,但我同意欧文他应该归还它。让工厂返回一个新实例与我对工厂的理解相矛盾。与其回答发布的问题,不如回答实际问题。
    • @HimBromBeere:我同意返回值是通常的工厂方法,但我不认为选择将其存储在工厂中会特别消除类的“工厂目的”。
    • 谢谢大家,你们都帮助我学习了新东西,欧文和弗拉特你们是顶尖的!
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多