两个几乎相同的构造函数

时间:2018-06-10 16:04:35

标签: c#

在我的应用程序中,我有一个与对象初始化程序一起使用的类。但我认为最好为类指定构造函数。所以我做了以下代码:

我的课程:

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; }
}

3 个答案:

答案 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");

请参阅:Named and Optional Arguments (C# Programming Guide)