aov*_*ven 5 .net c# type-systems
我希望这个问题不被认为过于主观 - 我真的不期待一个明确的答案,但我希望每个人的意见至少能帮助我形成自己的意见.
我正在实现一个自定义类型系统,它是经典OOP类型系统的超集.在这种类型的系统中,对象实例可以在运行时组合以形成新的实例,同时保留个体身份.
这段代码:
var p = new Person();
var pa = new Partner(p);
Run Code Online (Sandbox Code Playgroud)
...产生单个组合对象,其中"p"和"pa"是不同的符合OOP的视图.IOW,更改其中一个视图的属性值会立即反映在同时包含此属性的任何其他视图上.
这一切都运行良好,但它缺少两个用于查询类型标识的关键API.我真的希望能够编写这样的代码:
if (p is Partner)
{
(p as Partner).SomePartnerProperty = "...";
}
Run Code Online (Sandbox Code Playgroud)
这当然不起作用,因为"is"和"as"操作符的行为不能超出/扩展超出.NET的OOP规则所要求的范围.尽管如此,我仍然需要在我的类型系统中使用此功能.
我的第一个想法是使用附加到我的类型系统的所有实例的通用扩展方法:
public static bool Is<T>(this BaseType target) where T : BaseType { ... }
public static T As<T>(this BaseType target) where T : BaseType { ... }
Run Code Online (Sandbox Code Playgroud)
忽略不区分大小写的语言中的名称冲突问题,这在功能方面似乎没问题:
if (p.Is<Partner>())
{
p.As<Partner>().SomePartnerProperty = "...";
}
Run Code Online (Sandbox Code Playgroud)
但是,我不禁想知道 - 这真的是最好的,最方便的API吗?
您如何建议我实现这两个操作符,以便在应用程序代码中使用它们自然?
更新:对于任何想知道这种类型系统的目的的人......基本上,每种类型都属于两类:身份或角色.在我上面给出的示例中,Person是一个Identity(按设计),而Partner是一个Role(再次,通过设计 - 它的设计可能不同).这种类型的系统的基本规则是,任何数量的角色可以与任何给定的身份组成,而身份本身可能只用一个更高的身份组成(例如一个人有可能成为一个联系,但绝不能成为公司).这种类型系统使应用程序能够透明地处理例如合作伙伴对象,而不管他们拥有什么身份(例如,人员,公司,银行等).
我建议使用两个简单的函数。
第一个(至少对我来说)很直观,名称如下:
p.IsType(typeHere)
p.IsPartner()
Run Code Online (Sandbox Code Playgroud)
第二个是简单的 To-Call:
p.ToPartner()
Run Code Online (Sandbox Code Playgroud)
我不会将它们实现为泛型(只是感觉不适合我),尤其是最后一个。
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |