Oop 被调用方根据调用方类型执行操作

Oop 被调用方根据调用方类型执行操作,oop,Oop,我想知道,除了下面的模式外,是否还有其他更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象反过来使用上下文或缺少作为逻辑来构建必要的输出。我已经尝试将调用者/发送者设置为接口并将其自身作为接口传递,但真正的问题是,被调用对象甚至知道其调用者是谁,也就是说,将其与其他调用者区分开来,并在必要时采取单独的操作,这是否是一种良好的做法?我是不是少了一块拼图 Caller (CGQuery): public string RenderForLoop()

我想知道,除了下面的模式外,是否还有其他更好的模式,其中一个对象将自身作为上下文传递给另一个对象,而另一个对象反过来使用上下文或缺少作为逻辑来构建必要的输出。我已经尝试将调用者/发送者设置为接口并将其自身作为接口传递,但真正的问题是,被调用对象甚至知道其调用者是谁,也就是说,将其与其他调用者区分开来,并在必要时采取单独的操作,这是否是一种良好的做法?我是不是少了一块拼图

Caller (CGQuery):
        public string RenderForLoop()
        {
...
            sb.Append(string.Join("",this.ContentIsCGExpressions.Select(exp => exp.GetProcessedExpression(this))));
...

Callee (CGExpression):
        public string GetProcessedExpression(object context = null)
        {
...
           retv = ReplaceCodes(retv, context);
...
        private string ReplaceCodes(string retv, object context = null)
        {
...            retv = ReplaceContextSequenceCode(retv, context);
            return retv;
        }
...
        private string ReplaceContextSequenceCode(string retv, object context = null)
        {
            var _regx = new Regex("(?i)<q_ctx_seq>");
            var _matchresult = _regx.Match(retv);
            while (_matchresult.Success)
            {
                string replacement = FetchContextSequenceQueryTableFieldExpression(context);
                retv = retv.Replace(_matchresult.Groups[0].Value, replacement);
                _matchresult = _matchresult.NextMatch();
            }
            return retv;
        }

        private string FetchContextSequenceQueryTableFieldExpression(object context = null)
        {

            if (context != null && context is CGQuery)
            {
                return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression();
            }
            return this.CGStatementsUsedAsParamsFor.Any() ?
                this.CGStatementsUsedAsParamsFor.Single().FetchContextSequenceQueryTableFieldExpression(context) 
                :
                this.CGQueriesContentFor.Single().FetchContextSequenceQueryTableFieldExpression();
        }

抱歉,我不知道如何突出显示主块中的代码。

让调用者向被调用者传递包含要执行的操作的对象怎么样?可以在此操作中查询调用者,而被调用者不知道其存在


一般来说,我会说,决定调用对象类的行为不是一个好的OOP实践。

正如您所说,我考虑了委托;那么,您是说委托应该是GetProcessedExpression的非可选参数吗?或者我可能完全搞错了,GetProcessedExpression作为一个入口点太通用了。也许在这个调用者和被调用者之间应该有其他类?…事实上,我认为更多的是策略模式或访问者,这取决于控制流。委派意味着将任务交给另一个类(如中央服务或类似服务)。在本例中,您将移交负责执行所需操作的对象本身。
        if (context != null && context is CGQuery)
        {
            return ((CGQuery)context).FetchContextSequenceQueryTableFieldExpression();
        }