close
最近手邊進行一項工程,要將 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
其實數十種程式語言發展到現在,只要現在還在主流的,不管是哪一種,概念上都有共通和相同的部分。只是語法上的差異還真令人腦袋糾結,
全站熱搜