開発環境
- 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 コメント:
コメントを投稿