Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相同返回对象但不同枚举类型值和参数值类型的设计模式选项_C#_Design Patterns_Oop - Fatal编程技术网

C# 相同返回对象但不同枚举类型值和参数值类型的设计模式选项

C# 相同返回对象但不同枚举类型值和参数值类型的设计模式选项,c#,design-patterns,oop,C#,Design Patterns,Oop,我是设计模式的新手,因此对所有可用模式的了解有限。希望我能提供一些关于我试图解决的问题的细节,用户社区可以提供一些关于使用什么设计模式以及如何实现它的指导 返回对象对于每种类型的调用都是相同的 底层类实现可以在某些枚举类型上完成(即ActionType=1适用于ActionClass1,但不适用于ActionClass2和ActionClass3) 类参数因类型而异 例如: public enum ActionType { Action1, Action2, Action3 }

我是设计模式的新手,因此对所有可用模式的了解有限。希望我能提供一些关于我试图解决的问题的细节,用户社区可以提供一些关于使用什么设计模式以及如何实现它的指导

  • 返回对象对于每种类型的调用都是相同的
  • 底层类实现可以在某些枚举类型上完成(即ActionType=1适用于ActionClass1,但不适用于ActionClass2和ActionClass3)
  • 类参数因类型而异
  • 例如:

    public enum ActionType
    {
       Action1,
       Action2,
       Action3
    }
    
    可能的工厂模式实现:

    public static class ActionClass
    {
            public static int DoAction(ActionType type, int val1, int val2)
            {
                   switch (type)
                   {
                      case Type1: 
                           return new ActionClass1(val1, val2).DoAction();
                           break;
                      default:
                           throw new NotImplementedException();                      
                   }
             } 
    
             public static int DoAction(ActionType type, string val1)  
             {
                 switch (type)
                   {
    
                      case Type2: 
                           return new ActionClass2(val1).DoAction();
                           break;
                      case Type3:
                           return new ActionClass3(val1).DoAction();
                      default:
                            throw new NotImplementedException();                      
                   }
    
             }
    }    
    

    根据您的操作所代表的内容,您可能需要查看。否则,看起来已经很合适了,尽管我可能会将方法更改为不立即执行该操作,但会返回一个封装该操作的对象,并在操作不支持pa时使用TryXXX模式而不是异常参数类型:

    public static bool TryGetIntIntAction(
        ActionType type, out Func<int, int, int> func)
    {
        switch (type)
        {
        case ActionType.Action1:
            func = (val1, val2) => new ActionClass1(val1, val2).DoAction();
            return true;
        default:
            func = null;
            return false;
        }
    }
    
    public static bool TryGetStringAction(
        ActionType type, out Func<string, int> func)
    {
        switch (type)
        {
        case ActionType.Action2:
            func = val1 => new ActionClass2(val1).DoAction();
            return true;
        case ActionType.Action3:
            func = val1 => new ActionClass3(val1).DoAction();
            return true;
        default:
            func = null;
            return false;
        }
    }
    
    publicstaticbooltrygetingaction(
    ActionType类型,out Func(输出函数)
    {
    开关(类型)
    {
    案例ActionType.Action1:
    func=(val1,val2)=>newactionClass1(val1,val2).DoAction();
    返回true;
    违约:
    func=null;
    返回false;
    }
    }
    公共静态bool TryGetStringAction(
    ActionType类型,out Func(输出函数)
    {
    开关(类型)
    {
    案例ActionType.Action2:
    func=val1=>newactionclass2(val1.DoAction();
    返回true;
    案例ActionType.Action3:
    func=val1=>newactionclass3(val1.DoAction();
    返回true;
    违约:
    func=null;
    返回false;
    }
    }
    
    重构类型开关的常用方法是多态性,为每个
    操作类型创建一个类。由于每个
    DoAction
    重载采用不同的参数,您可以将其封装在“参数对象”中,并使用泛型将每个操作类型与其参数类型关联:

    public abstract ActionClass<T>
    {
        public abstract int DoAction(T parameter);
    }
    
    public class ActionClass2 : ActionClass<string>
    {
        public override int DoAction(string parameter) { ... }
    }
    
    公共抽象ActionClass
    {
    公共抽象int-DoAction(T参数);
    }
    公共类ActionClass2:ActionClass
    {
    公共重写int-DoAction(字符串参数){…}
    }
    
    Try方法的想法我很喜欢。它可能会返回数据。你能解释一下func=(val1,val2)=>语法是什么吗?@Blake Blackwell:这是一个lambda表达式,一种编写委托的简捷方法。
    func=((val1,val2)=>)
    为变量
    func
    分配一个函数,该变量接受两个参数(
    val1
    val2
    ),并返回