Mercurial > pub > bltoolkit
comparison HowTo/Patterns/DuckTyping.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 | |
3 using NUnit.Framework; | |
4 | |
5 using BLToolkit.Patterns; | |
6 | |
7 namespace HowTo.Patterns | |
8 { | |
9 //[TestFixture] | |
10 public class DuckTyping | |
11 { | |
12 // By default, all interface methods are optional. | |
13 // | |
14 public interface OptionalInterface | |
15 { | |
16 // If the source object does not implement the [b]Method1[/b], a NotImplementedException is thrown at [i]run time[/i]. | |
17 // | |
18 void Method1(); | |
19 | |
20 // If the source object does not implement the [b]Method2[/b], a TypeBuilderException is thrown at [i]build time[/i]. | |
21 // | |
22 /*[a]*/[MustImplement]/*[/a]*/ | |
23 void Method2(); | |
24 | |
25 // If the source object does not implement the [b]Method3[/b], an empty stub is genegated. | |
26 // The return value and all output parameters will be set to default values. | |
27 // | |
28 /*[a]*/[MustImplement(false, false)]/*[/a]*/ | |
29 int Method3(); | |
30 } | |
31 | |
32 // The MustImplement attribute also can control the entire interface. | |
33 // | |
34 /*[a]*/[MustImplement]/*[/a]*/ | |
35 public interface RequiredInterface | |
36 { | |
37 // If the source object does not implement the [b]Method1[/b], a TypeBuilderException is thrown at [i]build time[/i]. | |
38 // | |
39 void Method1(); | |
40 | |
41 // If the source object does not implement the [b]Method2[/b], a NotImplementedException is thrown at [i]run time[/i]. | |
42 // | |
43 /*[a]*/[MustImplement(false)]/*[/a]*/ | |
44 void Method2(); | |
45 | |
46 // If the source object does not implement the [b]Method3[/b], an empty stub is genegated. | |
47 // The return value and all output parameters will be set to default values. | |
48 // | |
49 /*[a]*/[MustImplement(false, false)]/*[/a]*/ | |
50 int Method3(); | |
51 } | |
52 | |
53 public class TestClass | |
54 { | |
55 public int Method3() | |
56 { | |
57 return 3; | |
58 } | |
59 } | |
60 | |
61 // Two or more interfaces can be mixed together. | |
62 // | |
63 public interface InterfaceMix : RequiredInterface, OptionalInterface | |
64 { | |
65 } | |
66 | |
67 //[Test] | |
68 public void Test() | |
69 { | |
70 InterfaceMix duck = /*[a]*/BLToolkit.Patterns.DuckTyping.Implement/*[/a]*/<InterfaceMix>(new TestClass()); | |
71 RequiredInterface duck1 = duck; | |
72 OptionalInterface duck2 = duck; | |
73 | |
74 duck1.Method1(); | |
75 duck2.Method1(); | |
76 } | |
77 } | |
78 } |