如何使用BaseClass

时间:2016-05-22 17:32:30

标签: c# oop inheritance

我这里有一段代码。

 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属性和生成。

2 个答案:

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