继承和属性值

时间:2009-05-18 19:53:34

标签: c# inheritance

我正在使用代表pdf的类来填充PDF应用程序。我在pdf上的每个文本框中都有一个属性,并且使用属性来指定属性映射到的pdf文本框。我的所有PDF都具有相同的属性,但pdf使用不同的文本框名称。因此,我能想到的唯一解决方案是创建一个基类,并让每个应用程序类型扩展我的基类并覆盖每个属性,只是为了抛出新的属性值。有更简单的方法吗?

示例(请注意,Application1和Application2之间的唯一区别是ITextField值从“TextBox1”更改为“TextBox2”:

public class Application
{
    private string accountNumber;
    public virtual string AccountNumber
    {
        get { return this.accountNumber; }
        set { this.accountNumber = value; }
    }
}

public class Application1 : Application
{
    [ITextField("TextBox1")]
    public override string AccountNumber
    {
        get
        {
            return base.AccountNumber;
        }
        set
        {
            base.AccountNumber = value;
        }
    } 
}

public class Application2 : Application
{
    [ITextField("TextBox2")]
    public override string AccountNumber
    {
        get
        {
            return base.AccountNumber;
        }
        set
        {
            base.AccountNumber = value;
        }
    }
}

由于

3 个答案:

答案 0 :(得分:0)

我知道这是一个糟糕的答案,但这似乎是一个非常好的方法。它也应该适用于未来的变化。

答案 1 :(得分:0)

如果该值确实是系统的一部分,那么可能将其作为属性:

public string AccountNumber {get;set;}
public string AccountNumberTextField {get;set;}

然后,您可以使用不同的属性来生成两个Application实例(相同类型)。这实际上取决于具体情况。

Eric Lippert有一篇关于何时(而不是)使用属性的博客:Properties vs. Attributes

答案 2 :(得分:0)

如果你打算使用属性,我会说基类不是正确的选择。要定义这样的方案,我会在基类上选择接口。维护的代码较少,它会给你带来同样的效果。

public interface IApplication
{
    string AccountNumber { get; set; }        
}

public class Application1 : IApplication
{
    [ITextField("TextBox1")]
    public string AccountNumber { get; set; }
}

public class Application2 : IApplication
{
    [ITextField("TextBox2")]
    public override string AccountNumber { get; set; }
}

此外,您可以使用基类构思来包含将属性映射到文本字段的字典,并将其设置在派生类中......如果每个属性中都包含大量属性,那么这只会非常有效您需要执行此操作的表单。

public abstract class Application
{
    public Application() { }

    private Dictionary<string, string> mappings = new Dictionary<string, string>();

    public Dictionary<string, string> Mappings
    {
        get { return mappings; }
    }

    public string AccountNumber { get; set; }

    protected abstract void ProvideMappings();        
}


public class Application1 : Application
{
    protected override void ProvideMappings()
    {
        Mappings.Add("AccountNumber", "TextBox1");
    }
}

public class Application2 : Application
{
    protected override void ProvideMappings()
    {
        Mappings.Add("AccountNumber", "TextBox2");
    }
}

真的需要更多的背景来说明哪些是好主意。用例将推动具体细节。例如,如果它将PropertyInfo映射到PDF字段的字符串名称,字典可以帮助你更多,它只取决于你如何使用它。