代码之家  ›  专栏  ›  技术社区  ›  Nick Spacek

建立一个物体给予另一个物体

oop
  •  0
  • Nick Spacek  · 技术社区  · 14 年前

    假设我调用了一个第三方API,它返回一个Post,我想把它的属性转移到我自己的Post类中。我以前有过这样的方法 public static my.Post build(their.Post post) 我想要的属性。

    但是,有一个接受 their.Post my.Post 在一个更贫穷的州?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Nix    14 年前

    人们通常反对使用公共静态方法,因为很难嘲笑它们(我不赞成这种流行)。

    这归结为设计,你想让他们的职位成为你班的一部分吗?如果您将它添加为“copy”构造函数,那么它现在将成为类的一部分,并且依赖于对post的更改。如果他们改变了他们的职位,你的代码必须适应。

    更好的解决方案是将其解耦。您需要找到一些扩展方法来映射这两者。一种方法是使用静态生成器方法(如您所提到的),或者如果您想更进一步,一个更复杂的解决方案是将您想要的信息从他们的文章中提取到某种类型的泛型集合类中。然后创建一个接受该构造函数类的构造函数。这样,如果他们改变了他们的设计,那么你的类就不会改变,你所要做的就是更新从他们的post到它的泛型表示的映射。

    public class MyPost{
    
       public MyPost(ICollectionOfProperties props){
           //copy all properties.   
       }
    
    }
    
    public static class TheirPostExtensions{
       public static ICollectionOfProperties ExtractProperties(this TheirPost thePost){
             return new CollectionOfProperties(){
                     A = thePost.PropA,
                     B = thePost.PropB
             };
       }
    }
    
    
    public class Example{
       public Example(){
           TheirPost tp = new TheirPost();
           ICollectionOfProperties  props = tp.ExtractProperties();
           MyPost mp = new MyPost(props);
       }
    
    }