当单个类需要不同的结构时,如何制定一个共同的行为

时间:2018-06-17 08:13:34

标签: c# design-patterns

我有一些C#类,其中包含一个创建我需要的字符串的方法。 2个类是相同的,但是1个类的不同之处:

public class Base 
{
    public abstract bool GetAction(out string res);
}

// There is another class B which does the same
public class A : Base 
{
    public override bool GetAction(out string res)
    {
       ...
       string str1 = some logic to get a string needed
       string str2 = some logic to get another string needed
       res = str1 + str2;
       ...
    }
}

public class C : Base
{
    List<Configs> configs;
    ...

    public override bool GetAction(out string res)
    {
       ...
       for(int i = 0 ; i < configs.size(); i++)
       {
           string str1 = some logic to get string based on configs[i].cfgString;
           string str2 = some logic to get another string based on configs[i].cfgString;
           res = res + configs[i].cfgString + str1 + str2; //immutable string is not the issue here so please ignore it
        }
     }

现在需要自己获取str1str2

我开始创建一个返回类,而不是像这样的GetAction方法的bool:

public StringsInfoClass
{
    public string Str1 { get; set; }
    public string Str2 { get; set; }
    ...
    public string ToString()
    { 
        return Str1 + Str2;
    }
}

问题是A类和B类确实只有一个Str1Str2,而C类可以有几个ButtonButton。由于它们派生自相同的基类,因此用户将期望相同的接口。 您认为这个问题的良好实施可能是什么?

1 个答案:

答案 0 :(得分:0)

如此简单,更具体地说,问题是,方法getAction()需要相同的返回类型,但A类和B类需要StringInfo作为返回类型,而C类需要List<StringInfo> }。

解决方案正在使用generics

public class Base<T> 
{
    public abstract T GetAction(out string res);
}

public class A : Base<StringInfo> 
{
   public override StringInfo GetAction(out string res)
   {
      //implementation
   }
}

public class C : Base<List<StringInfo>> 
{
   public override List<StringInfo> GetAction(out string res)
   {
      //implementation
   }
}

最后,如果你想使StringInfo更具可扩展性,你可以使用该类的抽象。如果您希望将来采用不同的行为,那么为toString()方法添加不同的逻辑会有所帮助。