Object-C中代码如何分离接口和实现

时间:2022-06-29 04:18:08

使用C#习惯了代码的布局为:public (interface,class with static memebers),internal (class with implementation).

比如实现一个网络的客户端,那么C#代码布局为:

文件'INetworkClient.cs'包含接口和带有静态方法的类

public interface INetworkClient

{

  string ServerIP {get; set;}

  bool ConnectToServer();

  bool DisconnectFromServer();

}

public class NetworkClient

{

  public static INetworkClient NewInstance(string serverIP)

  {

    return new NetworkClientImp(serverIP);

  }

}

文件'NetworkClient.cs'包含带有实现方法的类

internal class NetworkClientImp : INetworkClient

{

  public NetworkClientImp(string serverIP) {...}

  public string ServerIP {get; set;}

  public bool ConnectToServer() {...}

  public bool DisconnectFromServer() {...}

  //下面的似有方法就不对外可见,包括物理的方式,因为在INetworkClient文件中根本就看不到这些方法的声明

  private void DoSth1() {...}

  private void DoSth2() {...}

}

在OC中怎么实现上面同样的效果呢?

首先,实现INetworkClient.cs文件的相同接口效果- 一个接口和一个带有静态方法的类。

文件NetworkClient.h包含了一个interface定义,其中包含了类属静态方法,这个比C#舒服,一个interface就搞定了,不用分成两个。C#中可以用抽象类做成一个,只是抽象类又必须提供每个方法的实现。

@interface NetworkClient : NSObject

  +(NetworkClient) initWithServerIP: (NSString *) serverIP;

  @property NSString* serverIP;

  -(BOOL) connectToServer;

  -(BOOL) disconnectFromServer;

@end

再实现NetworkClient.cs文件的相同效果:

文件NetworkClient.m

@implement NetworkClient

  //private

  {  

    NSString * serverIP;

  }

  -(BOOL) doSth1 {...}

  -(BOOL) doSth2 {...}

  //public
  @synthesize serverIP;

  -(BOOL) connectToServer {...}

  -(BOOL) disconnectFromServer {...}

@end

实现到这一步,还是和C#的效果有差距,那就是NetworkClient.cs文件中internal关键字标识实现类型NetworkClientImp是只在本模块可见,外部模块是看不到的。只可惜,目前我还没有找到OC中这种对整个实现类型的访问进行控制的方法。

打完收工,虽然不能达到C#的完全的效果,但是还是要尽量做到这种实现隐藏的效果。