使用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#的完全的效果,但是还是要尽量做到这种实现隐藏的效果。