c#4.0中的dynamic还是真好用啊,可以实现二元分派
2011-08-04 15:36
465 查看
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
var objA = new ObjA();
var objB = new ObjB();
var visitorA = new VisitorA();
var visitorB = new VisitorB();
Test(objA, visitorA);
Test(objA, visitorB);
Test(objB, visitorA);
Test(objB, visitorB);
}
static void Test(IObj obj, AVisitor visitor)
{
visitor.Foo(obj);
}
}
interface IObj
{
void Say();
}
public class ObjA : IObj
{
public void Say()
{
Console.WriteLine("ObjA Say...");
}
}
public class ObjB : IObj
{
public void Say()
{
Console.WriteLine("ObjB Say...");
}
}
abstract class AVisitor
{
public void Foo<T>(T obj) where T : IObj
{
dynamic dObj = obj;
Foo(dObj);
}
protected abstract void Foo(ObjA obj);
protected abstract void Foo(ObjB obj);
}
class VisitorA : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
}
class VisitorB : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
}
}
namespace Test
{
class Program
{
static void Main(string[] args)
{
var objA = new ObjA();
var objB = new ObjB();
var visitorA = new VisitorA();
var visitorB = new VisitorB();
Test(objA, visitorA);
Test(objA, visitorB);
Test(objB, visitorA);
Test(objB, visitorB);
}
static void Test(IObj obj, AVisitor visitor)
{
visitor.Foo(obj);
}
}
interface IObj
{
void Say();
}
public class ObjA : IObj
{
public void Say()
{
Console.WriteLine("ObjA Say...");
}
}
public class ObjB : IObj
{
public void Say()
{
Console.WriteLine("ObjB Say...");
}
}
abstract class AVisitor
{
public void Foo<T>(T obj) where T : IObj
{
dynamic dObj = obj;
Foo(dObj);
}
protected abstract void Foo(ObjA obj);
protected abstract void Foo(ObjB obj);
}
class VisitorA : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorA Foo...");
obj.Say();
}
}
class VisitorB : AVisitor
{
protected override void Foo(ObjA obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
protected override void Foo(ObjB obj)
{
Console.WriteLine("VisitorB Foo...");
obj.Say();
}
}
}
相关文章推荐
- C#实现Dll(OCX)控件自动注册的两种方法 网上找的 然后 自己试了试 还是可以用的
- Win32关于GDI 的API (Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的。有时候我们之直接调用Win32 的API,可以很高效的实现想要)
- C#动态对象(dynamic)示例(实现方法和属性的动态)
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C#4.0 新特性 dynamic 简化Com调用的复杂度
- C#4.0中的dynamic关键字和ExpandoObject对象
- CEF的C#实现,可以实现用Chrome来渲染UI,期待已久的UI解决方案。
- C#方法参数个数和类型相同,名称不同,可以实现重载吗
- Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
- C#+Arcengine实现GP工具中的extract by mask(提取掩膜),可以实现提取shp范围的栅格数据,可用来获得shp范围的高程
- Json.net实现方便的Json转C#(dynamic动态类型)对象
- 《线性表的基础操作(实现了可以选择在创建初始链表时,是用头插法,还是用尾插法)》
- C#里内置的DateTime基本上都可以实现这些功能
- 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍
- C# 4.0 新特性dynamic、可选参数、命名参数等
- C#+arcengine调用GP工具实现extract values to points的功能(可以用来高程)
- luyikk 的C# PING 工具 与 传统的不一样的是 他可以修改你的 IP地址实现伪造ICMP数据包 ,当然 XP下无法使用 2003下才可以使用