我是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)
不确定这是否可行。 干杯
答案 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";
}