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

Object-C中代码如何分离接口和实现的更多相关文章

  1. C#动态编译代码,执行一个代码片段,或者从指定文件中加载某个接口的实现类

    在项目进行中有时候会需要配置一些复杂的表达式,在程序运行的时候执行表达式,根据结果执行相应的操作,简单写了一个类Expression,利用.net的动态编译技术实现,代码如下: public clas ...

  2. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  3. Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)

    继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...

  4. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  5. 在vue中使用import()来代替require.ensure()实现代码打包分离

    最近看到一种router的写法 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) const login = ...

  6. WPF中任意Object的XAML代码格式化输出

    原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...

  7. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  8. WPF换肤之四:界面设计和代码设计分离

    原文:WPF换肤之四:界面设计和代码设计分离 说起WPF来,除了总所周知的图形处理核心的变化外,和Winform比起来,还有一个巨大的变革,那就是真正意义上做到了界面设计和代码设计的分离.这样可以让美 ...

  9. Java中如何动态创建接口的实现

    有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务 ...

随机推荐

  1. AJAX - onreadystatechange

    [AJAX - onreadystatechange] 参考:http://www.w3school.com.cn/ajax/ajax_xmlhttprequest_onreadystatechang ...

  2. c# NPOI 导出EXCEL

    需要引入dll文件 也可以在NuGet里面管理(推荐) 比较方便 . using System; using System.Collections.Generic; using System.Linq ...

  3. Android自定义控件

    开发自定义控件的步骤: 1.了解View的工作原理  2. 编写继承自View的子类 3. 为自定义View类增加属性  4. 绘制控件  5. 响应用户消息  6 .自定义回调函数    一.Vie ...

  4. Weblogic常见故障常:JDBC Connection Pools(转)

    WebLogic Server中数据库连接池是一个经常出问题的地方,总结一下出问题的原因和解决办法. 一.数据库连接泄漏 此类问题一般都是由于开发人员没有正确关闭数据库连接造成的.比如使用完Conne ...

  5. java_js从字符串中截取数字

    var str="1件*20桶*30包*123.45公斤"; var res=str.match(/\d+(\.\d+)?/g); alert(res);

  6. 将搜狗词库.scel格式转化为.txt格式

    由于项目中要用到词库,而下载的搜狗词库是.scel格式,所以就用python脚本将搜狗词库.scel格式文件转化为.txt格式文件. #!/bin/python # -*- coding: utf-8 ...

  7. SAP 创建物料主数据分类视图特性

    1.CL01创建物料分类 2.去CT04中去创建特性值 创建完成之后保存, 3.创建物料的分类视图,选择相应的特性值

  8. Visual studio 生成事件的使用 、xcopy 实现 dll 复制操作、

    IF NOT "$(ConfigurationName)"=="publish" exit /B 0if not exist $(TargetPath)publ ...

  9. 关于fast cgi和php-fpm的关系

    相关文档“https://segmentfault.com/q/1010000000256516%20” 一.什么是cgi cgi是一个协议,这个协议规定我们web服务器访问的时候,nginx和php ...

  10. Linux C++ 开发常用工具,常用指令工作手册

    vim常用: :set nu显示行数 :set mouse=a 鼠标滑动屏幕,:set ic :set noic 忽略不忽略大小写 /word_to_search\c \c表示忽略大小写 c小写忽略, ...