在我的应用程序中,我有一个与对象初始化程序一起使用的类。但我认为最好为类指定构造函数。所以我做了以下代码:
我的课程:
def add_argument(self,message, attribute, var_type, default, help_txt):
data = comparse.parse(message, attribute, var_type, default, help_txt)
self.data.update(data)
现在我需要指定一个构造函数。但Url属性应该是可选的。我不知道该怎么做。因为当我指定两个不同的构造函数时,一个使用url,一个不使用它,感觉就像重复的代码。
extension UIImageView {
func convertPointToImageCoordinates(_ p:CGPoint) -> CGPoint {
switch self.contentMode {
case .scaleAspectFit:
let r = AVMakeRect(
aspectRatio: self.image!.size, insideRect: self.bounds)
let scale = self.image!.size.width / r.width
var p2 = CGPoint(x: p.x - r.minX, y: p.y - r.minY)
p2 = CGPoint(x: p2.x * scale, y: p2.y * scale)
return p2
default:
fatalError("not written")
}
}
}
指定两个几乎相同的构造函数或者是最佳解决方案是不是很糟糕。或者我应该只使用对象初始值设定项
编辑: 为了澄清我的问题。我现在正在创建一个来自这个类的对象。
public class Person
{
public string Name { get; set; }
public string SecondName { get; set; }
public string Address { get; set; }
public int Age { get; set; }
public DateTime BirthDate { get; set; }
public string Url { get; set; }
}
答案 0 :(得分:1)
你可以创建两个构造函数并从第二个调用第一个构造函数:
public Person(string name, string secondName, string address, int age, DateTime birthDate)
{
Name = name;
SecondName = secondName;
Address = address;
Age = age;
BirthDate = birthDate;
}
public Person(string name, string secondName, string address, int age, DateTime birthDate, string url)
: this (name, secondName, address, age, birthDate)
{
Url = url;
}
或者您可以将url
参数设为可选:
public Person(string name, string secondName, string address, int age, DateTime birthDate, string url = null)
{
Name = name;
SecondName = secondName;
Address = address;
Age = age;
BirthDate = birthDate;
Url = url;
}
答案 1 :(得分:0)
选项:
提供两个构造函数签名,几乎可以肯定从“没有URL的那个”委托给“带URL的那个”。例如:
public Person(string name, string secondName, string address,
int age, DateTime birthDate)
: this(name, secondName, address, age, birthDate, null)
{
}
public Person(string name, string secondName, string address,
int age, DateTime birthDate, string url)
{
// Set all the properties here
}
提供单个构造函数并为URL使用可选参数,例如
public Person(string name, string secondName, string address,
int age, DateTime birthDate, string url = null)
请注意= null
参数的url
部分,这使其成为可选参数。如果调用代码没有提供值,编译器将隐式传递null
(此处指定的默认值)。
在您提供这些“长”构造函数签名的情况下,还希望为希望使用对象初始值设定项的用户提供无参数签名。
答案 2 :(得分:0)
由于URL是最后一个参数,您可以将其设为可选(因为C#4.0)。只需在参数列表中为其指定所需的默认值即可。
public Person(
string name, string secondName, string address, int age, DateTime birthDate,
string url = null)
{ ... }
现在,您可以在调用构造函数时省略URL。
var p1 = new Person("John", "Smith", "New York", 17, new DateTime(2001, 3, 12));
var p2 = new Person("Sue", "Miller", "York", 22, new DateTime(1995, 7, 5), "www.sue-mi.com");