寻求抽象对象与抽象对象的交互的解决方案
品铭工作室 2014-06-24 06:35:35 我在做一个项目, 视图层使用的是抽象对象,而逻辑层是抽象的具体实现,在开发中期,发现很多问题,而最根本的问题是抽象与具体实现之间发生冲突。
要解决的问题:
任何事物在不同的人(角色)看来,都有不同的观点(关注点不一样),我们可以用多态的行为来解决,但在开发中引发的问题的我们想即想减少视图与逻辑的紧密度,同时又要保持其自身重定性和可扩展性,也就是逻辑的具体实现或改变不影响视图,但同时又要体现同一事物的多面性和发展性
举例:(C# 伪代码)
抽象父类
public abstrct class A { A.New( tag ); } //依据tag值 A.New方法返回不子类实例的抽象对象 ,
子类
private class A1:A { Name1{ get;set; } }
private A2:A { Name2{ get;set; } }.
.....后期依据需求会延伸出不同的子类
public abstrct class B (实现形式同上)
private class B1:B ,B2:B ...(子类)
抽象类与子类及子类之间有细节上的差异 , 另外父类与子类可能不存在于同一个物理位置 ( 就是所在的DLL不是同一个)
类之间的访问规则(父类之间、子类之间、父子类之间,同类型之间与不同类型之间):
1.在视图层只识别父类型,不知道子类型,
2.在逻辑层,
同一个类型下的父子类 之间可以相互访问或类型转换如A -> A1,A2.. ,B1->B,B2,B3...
但不同类型的父子关系只能通过抽象类进行交互(或说不同类型的子类是不能直接进行交互的),如:
B<->A , A1-> B,B1>A , 但不能 A1,A2->B1,B2 , B->A1
视图代码:
A a = A.New("A1");
B b = B.New( "B2" )
//需要对a与b内的某个拓展属性进行值的交互 ,
运行时的代码的样子: a.Name1 = b.Name2 ; 可能后期的子类还会出现其它新的属性和方法(不一定是Name1,Name2...不要固化思维或形而向上来才考虑问题),我是说在运行时的样子,但在编码时只知道A和B的类型,不知道其具体实现子类的扩展部分的元素(属性或方法),这种情况下如何实现抽象对象与抽象对象 (父对象与父对象)之间的交互??换句话说我需要确定具体的子类才可以交互。
原来我是实现个性化接口来实现 (每个子类实现唯一的接口),但这种方案行不通,最终还是间接的对子类型的依赖而且这种方案很笨不灵活,另外这个和反射没有关系,不要以为可以通过反射解决问题,一点关系都没有
最后,也许我在思路上出了问题,或也许进了牛角尖,但不管怎么样,还是请大家给点主意。多提点!