開発環境
- Microsoft Windows 8 Pro 64bit 日本語 (OS)
- Microsoft Visual Studio Express 2012 for Windows Desktop (IDE)
- プログラミング言語: C#
『初めてのC# 第2版』(Jesse Liberty+Brian MacDonald著、日向俊二訳、オライリー・ジャパン、2006年、ISBN978-487312-194-7)の 第13章(インタフェース)13.10(練習問題)練習13-4を解いてみる。
その他参考書籍
練習13-4.
コード
using System; interface IConvertible { string ConvertToCSharp(string str); string ConvertToVisualBasic(string str); } interface ICodeChecker : IConvertible { bool CodeCheckSyntax(string str, string lang); } class ProgramConverter : IConvertible { public ProgramConverter() { Console.WriteLine("Program Converterを作成"); } #region IConvertible public string ConvertToCSharp(string str) { return "C#の文字列に変換中"; } public string ConvertToVisualBasic(string str) { return "VBの文字列に変換中"; } #endregion IConvertible } class ProgramHelper : ProgramConverter, ICodeChecker { public ProgramHelper() { Console.WriteLine("Program Helperを作成"); } #region ICodeChecker public bool CodeCheckSyntax(string str, string lang) { Console.WriteLine("構文チェック"); switch (lang) { case "C#": return true; case "VB": return true; default: return false; } } #endregion ICodeChecker } class Tester { public void Display(string str, string[] langs, ICodeChecker i) { foreach (string lang in langs) { Console.WriteLine("{0}: {1}", lang, i.CodeCheckSyntax(str, lang)); } } public void Run() { ProgramHelper ph = new ProgramHelper(); ProgramConverter pc = new ProgramConverter(); string str = "文字列"; string cs = "C#"; string vb = "VB"; string js = "JavaScript"; string[] langs = { cs, vb, js }; ProgramConverter[] pcs = { ph, pc }; Console.WriteLine("is演算子"); foreach (ProgramConverter p in pcs) { if (p is ICodeChecker) { ICodeChecker i = (ICodeChecker)p; Display(str, langs, i); } else { Console.WriteLine("ICodeCheckerを実装していない。"); } } Console.WriteLine("as演算子"); foreach (ProgramConverter p in pcs) { ICodeChecker i = p as ICodeChecker; if (i != null) { Display(str, langs, i); } else { Console.WriteLine("ICodeCheckerを実装していない。"); } } } static void Main() { Tester t = new Tester(); t.Run(); } }
入出力結果(Console Window)
Program Converterを作成 Program Helperを作成 Program Converterを作成 is演算子 構文チェック C#: True 構文チェック VB: True 構文チェック JavaScript: False ICodeCheckerを実装していない。 as演算子 構文チェック C#: True 構文チェック VB: True 構文チェック JavaScript: False ICodeCheckerを実装していない。 続行するには何かキーを押してください . . .
ちなみにJavaScriptの場合。
コード(BBEdit)
// インタフェースじゃ無い代わりに、エラーを投げるようにしてみる function IConvertible(){} IConvertible.prototype.convert_to_javascript = function(s){ throw "convert_to_javascriptが実装されていません"; }; IConvertible.prototype.convert_to_python = function(s){ throw "convert_to_pythonが実装されていません"; }; function ICodeChecker(){} ICodeChecker.prototype.code_check_syntax = function(s, lang){ throw "code_check_syntaxが実装されていません"; }; function ProgramConverter(){ $('#pre0').append("Program Converterを作成\n"); IConvertible.apply(this, arguments); } ProgramConverter.prototype = new IConvertible(); ProgramConverter.prototype.convert_to_javascript = function(s){ return "JavaScriptの文字列に変換中"; }; ProgramConverter.prototype.convert_to_python = function(s){ return "Pythonの文字列に変換中"; }; // JavaScriptでの多重継承やインターフェースの実装っぽいことのやり方が分かってないので // 2段階で継承してみることに var tmp_ProgramConverter = new Function(ICodeChecker); tmp_ProgramConverter.prototype.convert_to_javascript = function(s){ return "JavaScriptの文字列に変換中"; }; tmp_ProgramConverter.prototype.convert_to_python = function(s){ return "Pythonの文字列に変換中"; }; function ProgramHelper(){ $('#pre0').append("ProgramHelperを作成\n"); tmp_ProgramConverter.apply(this, arguments); }; ProgramHelper.prototype = new tmp_ProgramConverter(); ProgramHelper.prototype.code_check_syntax = function(s, lang){ $('#pre0').append("構文チェック\n"); switch(lang){ case "JavaScript": return true; case "Python": return true; default: return false; } }; var ph = new ProgramHelper(); var pc = new ProgramConverter(); var s = "文字列"; var js = "JavaScript"; var py = "Python"; var pl = "Perl"; var langs = [js, py, pl]; var ps = [ph, pc]; for(var i = 0; i < ps.length; i++){ if(ps[i].code_check_syntax){ for(var j = 0; j < langs.length; j++){ $('#pre0').append( langs[i] + ": " + ps[i].code_check_syntax(s, langs[j]) + "\n"); } } else { $('#pre0').append('ICodeCheckerを実装していない。\n'); } }
pythonの場合。
sample.py
コード(BBEdit)
#!/usr/bin/env python3.3 # -*- coding: utf-8 -*- class IConvertible: def convert_to_python(self, s): raise Exception("convert_to_pythonが実装されていません") def convert_to_javascrpt(self, s): raise Exception("convert_to_javascrptが実装されていません") class ICodeChecker(IConvertible): def code_check_syntax(self, s, lang): raise Exception("code_check_syntaxが実装されていません") class ProgramConverter(IConvertible): def __init__(self): print("ProgramConverterを作成") def convert_to_python(self, s): return "Pythonの文字列に変換中" def convert_to_javascrpt(self, s): return "JavaScriptの文字列に変換中" # 多重継承 class ProgramHelper(ProgramConverter, ICodeChecker): def __init__(self): print("ProgramHelperを作成") def code_check_syntax(self, s, lang): print("構文チェック") if lang == "Python": return True if lang == "JavaScript": return True return False if __name__ == '__main__': ph = ProgramHelper() pc = ProgramConverter() s = "文字列" py = "Python" js = "JavaScript" rb = "Ruby" langs = [py, js, rb] ps = [ph, pc] for p in ps: if isinstance(p, ICodeChecker): for lang in langs: print("{0}: {1}".format( lang, p.code_check_syntax(str, lang))) else: print("Icodecheckerを継承していない")
入出力結果(Terminal)
$ ./sample.py ProgramHelperを作成 ProgramConverterを作成 構文チェック Python: True 構文チェック JavaScript: True 構文チェック Ruby: False Icodecheckerを継承していない $
0 コメント:
コメントを投稿