我这里有一段代码。
class TextBox
{
TextBox()
{
_guid = new Guid();
}
private Guid _guid;
public Guid Guid {
get { return _guid; }
private set { value = _guid; }
}
public string Label { get; set; }
}
但是我还有其他项目,如Button类,CheckBox类等。如何避免代码重复每次实现Guid属性和生成。
答案 0 :(得分:1)
您可以创建baseclass
,以便在构建时实例化Guid
。每个控件都只是从基础继承。
public class TextBox : Identifier
{
public string Label { get; set; }
}
public class CheckBox : Identifier
{
}
protected class Identifier
{
public Guid Guid
{
get; private set;
}
protected Identifier()
{
Guid = new Guid();
}
}
但是,如果Guid的目的是拥有唯一标识符,我建议只获取实例的Hash。
示例:
var textBoxId = MyTextBox.GetHashCode();
注意:如@Maarteen所述,GetHashCode不保证唯一性。按文档:
GetHashCode方法的默认实现没有 保证不同对象的唯一返回值。而且, .NET Framework不保证默认的实现 GetHashCode方法,它返回的值将是相同的 不同版本的.NET Framework。因此,默认 不得将此方法的实现用作唯一对象 用于散列目的的标识符。
答案 1 :(得分:0)
如果要扩展现有控件,则必须继承此控件
public class MyTextBox : TextBox
{
public Guid Guid { get; set; }
public string Label { get; set; }
}
由于无法更改现有控件,因此必须为每个控件重复此操作。如果要从头创建继承层次结构(这对于控件是不可能的),您只需在基类中添加这些属性并从中派生其他类。
如果要集成更复杂的功能,可以使用合成,即单独创建新功能并从派生类中调用
public class ComplexFunctionality
{
private readonly Control _c;
public ComplexFunctionality(Control c)
{
_c = c;
}
public void SettingGuid(Guid newGuid)
{
...
}
}
public class MyTextBox : TextBox
{
private readonly ComplexFunctionality _cs = new ComplexFunctionality(this);
private Guid _guid;
public Guid Guid {
get { return _guid; }
private set {
_cs.SettingGuid(value);
_guid = value;
}
}
}