close

CSharp_ObjC

最近手邊進行一項工程,要將 Object-C 的程式碼「移植」到 C# 的機器上。Object-C 是拿手的,但 C# 完全不熟啊~於是上網找了一些資料,練習嘗試設計一個小範例,用Object-C 與 C# 各寫了一份,體會其中的奧妙。

範例是設計一個類別 iPhone4S,用實例與單例宣告為物件並賦予預設值。

Object-C

iPhone4S.h
#import <Foundation/Foundation.h>

@interface iPhone4S : NSObject

@property (nonatomic,retain) NSString *simCode;

+ (instancetype)shareInstance;

- (NSString *)doCallOut:(NSString *)phoneNumber;

- (NSString *)handUp;

- (NSString *)volumeChanged:(NSInteger)volumeVal;

- (NSString *)doVibrate;

- (NSString *)doSiri:(NSString *)speakCommand;

@end

iPhone4S.m
#import "iPhone4S.h"

@implementation iPhone4S

static iPhone4S *theiPhone4s = nil;

- (instancetype)init{
self = [super init];
if (self) {
self.simCode = @"0000";
}
return self;
}

+ (instancetype)shareInstance{
@synchronized (theiPhone4s) {
if (theiPhone4s == nil) {
theiPhone4s = [[iPhone4S alloc] init];
}
else{
NSLog(@"NOT NEW 新建iphone4S");
}
}
return theiPhone4s;
}


- (NSString *)doCallOut:(NSString *)phoneNumber{
NSLog(@"iOS打電話給%@",phoneNumber);
return @"撥號中";

}

- (NSString *)handUp{
NSLog(@"iOS將通話中電話結束");
return @"結束通話";
}

- (NSString *)volumeChanged:(NSInteger)volumeVal{
NSLog(@"iOS將音量調整為%li",(long)volumeVal);
return @"完成調音量";
}

- (NSString *)doVibrate{
NSLog(@"iOS將轉振動");
return @"完成轉振動";
}

- (NSString *)doSiri:(NSString *)speakCommand{
return [@"Siri說:" stringByAppendingString:speakCommand] ;
}

@end

C#

iPhone4S.cs
using System; public class iPhone4S { #region 宣告變數名稱 public string simCode { set; get; } //姓名 #endregion private static readonly object locker = new object(); private static iPhone4S theiPhone4s = null; /* 使用 private 則禁止從外部產生實例,用於Singleton private iphone4S() { simcode = "0000"; Console.WriteLine("iphone4S 電話:" + phonenumber); } */ public iPhone4S() { simCode = "0000"; } public static iPhone4S shareInstance() { lock (locker) { if (theiPhone4s == null) { theiPhone4s = new iPhone4S(); } else { Console.WriteLine("NOT NEW 新建iphone4S"); } } return theiPhone4s; } public string doCallOut(string phoneNumber) { Console.WriteLine("iOS打電話給" + phoneNumber); return "撥號中"; } public string handUp() { Console.WriteLine("iOS將通話中電話結束"); return "結束通話"; } public string volumeChanged(int volumeVal) { Console.WriteLine("iOS將音量調整為" + volumeVal); return "完成調音量"; } public string doVibrate() { Console.WriteLine("iOS將轉振動"); return "完成轉振動"; } public string doSiri(string speakCommand) { return "Siri說:" + speakCommand; } }

驗證:設計一個按鈕,print 結果

Object-C

-(IBAction)btnLogSimCode_Click:(id)sender{
iPhone4S *myPhone = [[iPhone4S alloc] init];
iPhone4S *companyPhone = [iPhone4S shareInstance];
iPhone4S *companyPhone2 = [iPhone4S shareInstance];

myPhone.simCode = @"1234";
companyPhone2.simCode = @"5678";

NSLog(@"myPhone 電話 Sim Code:%@" , myPhone.simCode);
NSLog(@"companyPhone 電話 Sim Code:%@" , companyPhone.simCode);
NSLog(@"companyPhone2 電話 Sim Code:%@" , companyPhone2.simCode);
}

結果輸出:
[1742:111130] NOT NEW 新建iphone4S
[1742:111130] myPhone 電話 Sim Code:1234
[1742:111130] companyPhone 電話 Sim Code:5678
[1742:111130] companyPhone2 電話 Sim Code:5678

C#

private void btnLogSimCode_Click(object sender, EventArgs e)
{
iPhone4S myPhone = new iPhone4S();
iPhone4S companyPhone = iPhone4S.shareInstance();
iPhone4S companyPhone2 = iPhone4S.shareInstance();

myPhone.simCode = "1234";
companyPhone2.simCode = "5678";

Console.WriteLine("myPhone 電話 Sim Code:" + myPhone.simCode);
Console.WriteLine("companyPhone 電話 Sim Code:" + companyPhone.simCode);
Console.WriteLine("companyPhone2 電話 Sim Code:" + companyPhone2.simCode);
}

結果輸出:
NOT NEW 新建iphone4S
myPhone 電話 Sim Code:1234
companyPhone 電話 Sim Code:5678
companyPhone2 電話 Sim Code:5678

 

其實數十種程式語言發展到現在,只要現在還在主流的,不管是哪一種,概念上都有共通和相同的部分。只是語法上的差異還真令人腦袋糾結,

arrow
arrow
    全站熱搜

    benjenq 發表在 痞客邦 留言(0) 人氣()