我知道我不能拥有相同参数的构造函数。但是例如类包含这个
var problem = "find the longest word in the problem description"
var last = problem.characters.last
let lastIndex = problem.characters.endIndex;
print(last);
var words:[String] = [String]();
var word:String = "";
var lastCheck:Int = 0;
for i in problem.characters{
lastCheck = lastCheck + 1
if i != " "{
word = word + String(i)
}
else if lastCheck = lastIndex{
words.append(word);
}
else if i == " "{
words.append(word)
word = ""
}
}
print(words)
我有多个模型枚举,只有一个品牌。我不知道如何编写构造函数因为它只需要品牌作为参数而一个模型取决于我们选择的品牌。
public enum Brand { audi, bmw };
public enum ModelAudi { /*some models*/ };
public enum ModelBmw { /*some models */};
前两个构造函数因为它具有相同的参数而无法工作。最后一个会工作,但它将有很多空(无)模型枚举。那么简单地制作它的最佳方法是什么?
答案 0 :(得分:1)
前两个构造函数不起作用,因为它具有相同的参数。
不,它没有具有相同的参数。第二个参数在每种情况下都是不同的类型,所以它编译得很好。
当然,在第一种情况下,你知道这个品牌是奥迪,而在第二种情况下,你知道它是宝马,所以没有必要接受“品牌”参数(并不是说在任何一种情况下都无法编译)。
答案 1 :(得分:0)
当对象构造本身需要某种程度的逻辑 - 在这种情况下比类的其他部分包含更多的逻辑 - 那么将构造与类分开可能是有意义的。这就是Builder模式。
您在Google上找到的许多示例都可以解决更复杂的问题。但在这种情况下,你正在处理一些更简单的事情。您希望根据某些枚举的值来更具体地使用构造函数。
您可以执行类似
的操作public class AutomobileBuilder
{
//For the types that only need brand
public Automobile BuildFord()
{
//call constructor, create Automobile
}
//For types requiring more options:
public Automobile BuildAudi(AudiModel model)
{
//call constructor, create Automobile
}
}
您可以将Automobile
构造函数声明为internal
,强制您的库的使用者使用该构建器。
答案 2 :(得分:-1)
只需做一个模型枚举:
public enum Brand { audi, bmw };
public enum Model { /*All your models*/ };
然后你的构造函数:
public Automobile(Brand brand, Model Audi)
{
this.Brand = brand;
this.Model = Audi;
}
B.S您可能需要重命名/调整类设计和成员变量吗?