Mercurial > pub > bltoolkit
diff HowTo/Patterns/DuckTyping.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HowTo/Patterns/DuckTyping.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,78 @@ +using System; + +using NUnit.Framework; + +using BLToolkit.Patterns; + +namespace HowTo.Patterns +{ + //[TestFixture] + public class DuckTyping + { + // By default, all interface methods are optional. + // + public interface OptionalInterface + { + // If the source object does not implement the [b]Method1[/b], a NotImplementedException is thrown at [i]run time[/i]. + // + void Method1(); + + // If the source object does not implement the [b]Method2[/b], a TypeBuilderException is thrown at [i]build time[/i]. + // + /*[a]*/[MustImplement]/*[/a]*/ + void Method2(); + + // If the source object does not implement the [b]Method3[/b], an empty stub is genegated. + // The return value and all output parameters will be set to default values. + // + /*[a]*/[MustImplement(false, false)]/*[/a]*/ + int Method3(); + } + + // The MustImplement attribute also can control the entire interface. + // + /*[a]*/[MustImplement]/*[/a]*/ + public interface RequiredInterface + { + // If the source object does not implement the [b]Method1[/b], a TypeBuilderException is thrown at [i]build time[/i]. + // + void Method1(); + + // If the source object does not implement the [b]Method2[/b], a NotImplementedException is thrown at [i]run time[/i]. + // + /*[a]*/[MustImplement(false)]/*[/a]*/ + void Method2(); + + // If the source object does not implement the [b]Method3[/b], an empty stub is genegated. + // The return value and all output parameters will be set to default values. + // + /*[a]*/[MustImplement(false, false)]/*[/a]*/ + int Method3(); + } + + public class TestClass + { + public int Method3() + { + return 3; + } + } + + // Two or more interfaces can be mixed together. + // + public interface InterfaceMix : RequiredInterface, OptionalInterface + { + } + + //[Test] + public void Test() + { + InterfaceMix duck = /*[a]*/BLToolkit.Patterns.DuckTyping.Implement/*[/a]*/<InterfaceMix>(new TestClass()); + RequiredInterface duck1 = duck; + OptionalInterface duck2 = duck; + + duck1.Method1(); + duck2.Method1(); + } + } +}