Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
ikusik
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 2
1

Объяснить приведённый код с шаблонным методом

04.11.2014, 21:26. Просмотров 296. Ответов 1
Метки нет (Все метки)

помогите объяснить код

BaseTemplate.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System.Collections.Generic;
using FluTeLib.Core.helper;
using FluTeLib.Core.Input;
using FluTeLib.Core.Token;
 
namespace FluTeLib.Core.Template
{
    public abstract class BaseTemplate
    {
        private readonly ImmutableMap<InputKey, IInput> inputs;
 
        private readonly ProcessingQueue postProcessingQueue;
 
        private readonly ImmutableMap<TokenKey, IToken> tokenMap;
 
        private readonly ImmutableList<TokenReference> tokenSeq;
 
        protected BaseTemplate
            (ImmutableMap<TokenKey, IToken> tokenMap, ImmutableList<TokenReference> tokenSeq,
             ImmutableMap<InputKey, IInput> inputs, ProcessingQueue postProcessingQueue)
 
        {
            this.tokenSeq = tokenSeq;
            this.inputs = inputs;
            this.tokenMap = tokenMap;
            this.postProcessingQueue = postProcessingQueue;
        }
 
        protected BaseTemplate(IEnumerable<IToken> fTokens)
            : this(
                new ImmutableMap<TokenKey, IToken>(), ImmutableList.Empty<TokenReference>(), new ImmutableMap<InputKey, IInput>(),
                ProcessingQueue.Empty())
        {
            foreach (var tok in fTokens)
            {
                if (tokenMap.ContainsKey(tok.Key))
                {
                    tokenSeq = tokenSeq.ConsLast(new TokenReference(tok.Key));
                }
                else
                {
                    foreach (var input in tok.Inputs)
                    {
                        if (!inputs.ContainsKey(input.Key))
                        {
                            var newInput = input.Key.Type == InputType.Instance
                                            ? (IInput) new UnboundInput(input.Key) : new UnboundStaticInput(input.Key);
                            inputs = inputs.Add(input.Key, newInput);
                        }
                    }
                    tokenMap = tokenMap.Add(tok.Key, tok);
                    tokenSeq = tokenSeq.ConsLast(new TokenReference(tok.Key));
                }
            }
        }
 
        /// <summary>
        ///   
        /// </summary>
        internal ImmutableMap<InputKey, IInput> Inputs
        {
            get
            {
                return inputs;
            }
        }
 
        internal ProcessingQueue PostProcessingQueue
        {
            get
            {
                return postProcessingQueue;
            }
        }
 
        /// <summary>
        ///   
        /// </summary>  
        internal ImmutableList<TokenReference> TokenSequence
        {
            get
            {
                return tokenSeq;
            }
        }
 
        /// <summary>
        ///  
        /// </summary>
        internal ImmutableMap<TokenKey, IToken> Tokens
        {
            get
            {
                return tokenMap;
            }
        }
    }
}




FluTeCoreInstance.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using FluTeLib.Core.helper;
using FluTeLib.Core.Input;
using FluTeLib.Core.Token;
 
namespace FluTeLib.Core.Template
{
    /// <summary>
    ///   
    /// </summary>
    [DebuggerTypeProxy(typeof (DebugProxy))]
    public class FluTeCoreInstance : BaseTemplate
    {
        public FluTeCoreInstance(FluTeCorePrototype template)
            : base(template.Tokens, template.TokenSequence, template.Inputs, template.PostProcessingQueue)
        {
        }
 
        private FluTeCoreInstance
            (ImmutableMap<TokenKey, IToken> tokenMap, ImmutableList<TokenReference> tokenSeq,
             ImmutableMap<InputKey, IInput> inputs, ProcessingQueue postProcessingQueue)
            : base(tokenMap, tokenSeq, inputs, postProcessingQueue)
        {
        }
 
        public FluTeCoreInstance BindInput(string name, object value)
        {
            var key = new InputKey(name, InputType.Instance);
            if (!Inputs.ContainsKey(key))
            {
                throw new KeyNotFoundException("Tried to bind an input name that does not exist.");
            }
            var input = Inputs[key];
 
            if (input is IBoundInput)
            {
                throw new InvalidOperationException("Cannot bind a value to an input that has already been bound.");
            }
            var inputAs = input as IUnboundInput;
 
            return new FluTeCoreInstance(Tokens, TokenSequence, Inputs.Set(key, inputAs.Bind(value)), PostProcessingQueue);
        }
 
        public string Resolve()
        {
            foreach (var input in Inputs.Values)
            {
                if (!(input is IBoundInput))
                {
                    throw new InvalidOperationException("Cannot resolve the template while some inputs remain unbound.");
                }
            }
            var resolvedTokens = from tokRef in TokenSequence.AsEnumerable
                                 let tok = Tokens[tokRef.Key]
                                 let resolvedTok = (tok as IResolvedToken) ?? ((IUnresolvedToken) tok).Resolve(this)
                                 select resolvedTok.Value;
 
            return (string)PostProcessingQueue.Invoke(string.Join("", resolvedTokens));
        }
 
        #region Nested type: DebugProxy
 
        private class DebugProxy
        {
            private readonly FluTeCoreInstance inner;
 
            public DebugProxy(FluTeCoreInstance inner)
            {
                this.inner = inner;
            }
 
            public ImmutableMap<InputKey, IInput> Inputs
            {
                get
                {
                    return inner.Inputs;
                }
            }
 
            public ImmutableList<TokenReference> TokenSequence
            {
                get
                {
                    return inner.TokenSequence;
                }
            }
 
            public ImmutableMap<TokenKey, IToken> Tokens
            {
                get
                {
                    return inner.Tokens;
                }
            }
        }
 
        #endregion
    }
}
FluTeCorePrototype.cs

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using FluTeLib.Core.helper;
using FluTeLib.Core.Input;
using FluTeLib.Core.Token;
 
namespace FluTeLib.Core.Template
{
    [DebuggerTypeProxy(typeof (DebugProxy))]
    public class FluTeCorePrototype : BaseTemplate
    {
        public FluTeCorePrototype(IEnumerable<IToken> fTokens)
            : base(fTokens)
        {
        }
 
        private FluTeCorePrototype
            (ImmutableMap<TokenKey, IToken> tokenMap, ImmutableList<TokenReference> tokenSeq,
             ImmutableMap<InputKey, IInput> inputs, ProcessingQueue postProcessingQueue)
            : base(tokenMap, tokenSeq, inputs, postProcessingQueue)
        {
        }
 
        public FluTeCorePrototype AttachPostProcessingStep(IProcessingStep step)
        {
            return new FluTeCorePrototype(Tokens, TokenSequence, Inputs, PostProcessingQueue.Extend(step));
        }
 
        public FluTeCorePrototype AttachProcessingStep(string token, IProcessingStep step)
        {
            var key = new TokenKey(token, TokenType.Injection);
            if (!Tokens.ContainsKey(key))
            {
                throw new KeyNotFoundException("Could not find an injection token with the specified name.");
            }
            else
            {
                var tok = (IUnresolvedToken) Tokens[key];
                tok = tok.AttachStep(step);
                return new FluTeCorePrototype(Tokens.Set(key, tok), TokenSequence, Inputs, PostProcessingQueue);
            }
        }
 
        public FluTeCoreInstance Construct()
        {
            if (Inputs.Values.Any(x => x is IUnboundStaticInput))
            {
                throw new InvalidOperationException("Cannot complete the template because some predefined inputs are still empty.");
            }
            return new FluTeCoreInstance(this);
        }
 
        public FluTeCorePrototype DefineStaticInput(string name, Func<object> binding)
        {
            var key = new InputKey(name, InputType.Static);
            if (!Inputs.ContainsKey(key))
            {
                throw new KeyNotFoundException("A static input with the specified name could not be found.");
            }
            
            var input = Inputs[key];
            if (input is IBoundInput)
            {
                throw new InvalidOperationException("The specified static input is already bound.");
            }
            var unboundInput = (IUnboundStaticInput) input;
            var boundInput = unboundInput.Define(binding);
            return new FluTeCorePrototype(Tokens, TokenSequence, Inputs.Set(boundInput.Key, boundInput), PostProcessingQueue);
        }
 
        #region Nested type: DebugProxy
 
        private class DebugProxy
        {
            private readonly FluTeCorePrototype inner;
 
            public DebugProxy(FluTeCorePrototype inner)
            {
                this.inner = inner;
            }
 
 
            public ImmutableMap<InputKey, IInput> Inputs
            {
                get
                {
                    return inner.Inputs;
                }
            }
 
            public ImmutableList<TokenReference> TokenSequence
            {
                get
                {
                    return inner.TokenSequence;
                }
            }
 
            public ImmutableMap<TokenKey, IToken> Tokens
            {
                get
                {
                    return inner.Tokens;
                }
            }
        }
 
        #endregion
    }
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 21:26
Ответы с готовыми решениями:

Объяснить приведенный код
Кто может объяснить мне этот код. Что она делает и в каких местах особенно Fixed. Вот код...

Объяснить приведённый код (палиндром)
Всем привет. Распишите пожалуйста действие данной функции по пунктам. Спасибо ...

Разобрать приведенный код и объяснить его назначение
объясните, что делает этот метод static string NewMas(ref int i, int indexdel, int mas, ref...

Прокомментировать приведенный код и объяснить его назначение
Доброго времени суток! Прошу помочь разобраться с программой на ассемблере, написать комменты или...

1
asql
75 / 76 / 40
Регистрация: 03.06.2014
Сообщений: 462
04.11.2014, 21:30 2
Ну вы загнули!))
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2014, 21:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Объяснить приведенный случай GET-запроса
Есть адрес, к примеру, site.ru/page.html?menu Все что после вопроса - php метод GET. Но как он...

Разобрать приведенный код
Добрый день, товарищи программисты! Пытаюсь разобрать ассемблерный код. Наткнулся на такие...

Откомпилировать приведенный код
Доброго времени суток. Прошу помощи, т.к. просто напрсто &quot;горю&quot;. Есть исходник игры &quot;морской бой&quot;...

Оптимизировать приведенный код
Добрый всем день! На мое тестовое задание при приеме на курсы php сказали, что выполнено на низком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.