如何使用C#中的构造函数调用类而不传递参数

时间:2017-06-27 00:37:46

标签: c# class constructor

我是C#和oop的新手。 所以我想要解决的问题。 有没有办法做这样的事情:

var acs = new Acs();

所以当我在上面创建类对象时,它使用下面的apikey和apiurl而不将这些参数传递给Acs()

public class Acs : ActiveCampaignService
{
    public Acs(string apiKey, string apiUrl, string apiPassword = null) : base(apiKey, apiUrl, apiPassword)
    {
        apiKey = "my_api_key";
        apiUrl = "my_api_url";
        //return when var acs = new Acs(); is used
    }
}

也应该:

public Acs(string apiKey, string apiUrl, string apiPassword = null)

是:

private Acs(string apiKey, string apiUrl, string apiPassword = null)

不确定这是否可行。 干杯

4 个答案:

答案 0 :(得分:1)

如果您将构造函数设为私有,则无法实例化该类。如果你想按照你提出的方式创建你的类,你将不得不使用对象初始化器。

您需要一个默认构造函数,即没有任何参数的构造函数,以便我的建议可行。两个构造函数都可以存在于同一个类中,您可以选择要调用的那个。

public Acs(string apiKey, string apiUrl, string apiPassword = null) : base(apiKey, apiUrl, apiPassword)
{
    apiKey = "my_api_key";
    apiUrl = "my_api_url";
}

public Acs()
{
    // anything you want here, or nothing.
}

public string ApiKey { get; set; }
public string ApiUrl { get; set; }

然后以这种方式创建对象。

var acs = new Acs()
{
    ApiKey = "...",
    ApiUrl = "..."
};

我建议像我一样将apiKey和apiUrl作为公共属性。

答案 1 :(得分:1)

您可以使用构造函数链接,您可以在其中创建使用不同参数的不同构造函数。每个调用下一​​个,传入未指定参数的默认值。所以你从一个空的开始,你也可以创建一个不带密码的。然后你有一个拿走一切的东西,那就是那个真正做某事的东西。这称为构造函数链接:

public class Acs : ActiveCampaignService
{
    // Assuming you have class properties to hold values passed in from constructor
    private string ApiKey { get; set; }
    private string ApiUrl { get; set; }
    private string ApiPassword { get; set; }

    // Default constructor takes no arguments. Passes default values to next constructor
    public Acs() : this ("my_api_key", "my_api_url")
    { }

    // This constructor takes two arguments and passes them to
    // the next constructor, passing null for the apiPassword
    public Acs(string apiKey, string apiUrl) : this(apiKey, apiUrl, null)
    { }

    // This is the final constructor that does something 
    // with the values, and calls the base constructor
    public Acs(string apiKey, string apiUrl, string apiPassword) 
        : base(apiKey, apiUrl, apiPassword)
    {
        ApiKey = apiKey;
        ApiUrl = apiUrl;
        ApiPassword = apiPassword;
    }
}

答案 2 :(得分:0)

如果将构造函数设置为private,则无法调用该构造函数。如果将其设置为protected,则只有从Acs继承的类才能实例化。那是你开的吗?

答案 3 :(得分:0)

我正在阅读这个问题,因为每个(新)对象都应该具有相同值的这两个属性。所以使用static。此外,他们可以(应该)在基类中,因为您将它们传递给基础构造函数。

public class ActiveCampaignService
{
   protected static ApiKey { get { return "my_api_key"; }}
   protected static ApiUrl { get { return "my_api_url"; }}

   public ActiveCampaignService (string apiPassword = null) : base (apiPassword)  { }
}

如图所示,派生类可以访问这些静态属性,但不能访问其他客户端代码。

public class Acs : ActiveCampaignService {

   public Acs ( string apiPassword = null) : base (apiPassword)
      someVariable = ActiveCampaignService.ApiUrl + " morePath";
}