《Java是如何快速煮成C#的?》(一):相似的方法(2)
在上篇《 Java是如何快速煮成C#的?》(一):相似的方法 》中,我们开启了C#与Java中的话题之一:相似的方法。本节我们再举例说明,到底有多相似。
我们用一个简单的工厂模式的例子说明,顺便复习下设计模式,呵呵。
首先邀月得补充一下:
1、语言对比:Java的文件名必须与类名匹配。在Java中,文件名必须遵循类的名称。在C#中,虽然通常如此,但不是必需的。在C#中,可以有两个class在一个文件中,并且从C#2.0开始,可能有一个Class跨越多个文件。
2、简单工厂(Simple Factory)模式
Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。
好了,我们看一个C#/Java的类图
就类图本身而言,除了String与string的大小写之外,并无区别。两个图均用Powerdesigner所画,只是依据模板分别为c#2.0和Java。
基类:Namer
派生类:FirstFirst和LastFirst均继承Namer
NameFactory实现了Namer的Create方法,在本例中为getName()。
代码对比如下:
Namer(C#):
using System; namespace NameFactory { /// <summary> /// Summary description for Namer. /// </summary> //Base class for getting split names public class Namer { //parts stored here protected string frName, lName; //return first name public string getFrname() { return frName; } //return last name public string getLname() { return lName; } } }
Namer(Java):
package com.factory.SimpleFactory; public class Namer { protected String frName, lName; //return first name public String getFrname() { return frName; } //return last name public String getLname() { return lName; } }
FirstFirst(C#):
using System; namespace NameFactory { /// <summary> /// Summary description for FirstFirst. /// </summary> public class FirstFirst : Namer { public FirstFirst(string name) { int i = name.IndexOf(" "); if (i > 0) { frName = name.Substring(0, i).Trim(); lName = name.Substring(i + 1).Trim(); } else { lName = name; frName = ""; } } } }
FirstFirst(Java):
package com.factory.SimpleFactory; public class FirstFirst extends Namer { public FirstFirst(String name) { int i = name.indexOf(" "); if (i > 0) { frName = name.substring(0, i).trim(); lName = name.substring(i + 1).trim(); } else { lName = name; frName = ""; } } }
LastFirst(C#):
using System; namespace NameFactory { /// <summary> /// Summary description for LastFirst. /// </summary> public class LastFirst : Namer { public LastFirst(string name) { int i = name.IndexOf(","); if (i > 0) { lName = name.Substring(0, i); frName = name.Substring(i + 1).Trim(); } else { lName = name; frName = ""; } } } }
LastFirst(Java):
package com.factory.SimpleFactory; public class LastFirst extends Namer { public LastFirst(String name) { int i = name.indexOf(","); if (i > 0) { lName = name.substring(0, i); frName = name.substring(i + 1).trim(); } else { lName = name; frName = ""; } } }
NameFactory(C#):
using System; namespace NameFactory { /// <summary> /// Summary description for NameFactory. /// </summary> public class NameFactory { public NameFactory() { } public Namer getName(string name) { int i = name.IndexOf(","); if (i > 0) return new LastFirst(name); else return new FirstFirst(name); } } }
NameFactory(Java):
package com.factory.SimpleFactory; public class NameFactory { public NameFactory() { } public Namer getName(String name) { int i = name.indexOf(","); if (i > 0) return new LastFirst(name); else return new FirstFirst(name); } }
测试方法:(C#):
using System; using System.Text; namespace NameFactory { class Program { static string s; private static NameFactory nameFact; static void Main(string[] args) { System.Console.WriteLine("please enter a string:"); s = Console.ReadLine(); //s="zhang,tony"; ShowFactoryName(s); Console.ReadKey(); } static void ShowFactoryName(String input) { System.Console.WriteLine("input:" + input); nameFact = new NameFactory(); Namer nm = nameFact.getName(input);//此处可以用反射,类似于getClass方法 System.Console.WriteLine("FirstName:" + nm.getFrname()); System.Console.WriteLine("LastName:" + nm.getLname()); } } }
(Java):
package com.factory.SimpleFactory; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class SimpleFactoryDemo1 { private static NameFactory nameFact; static String s; /** * @param args */ /** * @param args */ public static void main(String[] args) { System.out.println("please enter a string:"); try { BufferedReader in = new BufferedReader(new InputStreamReader( System.in)); s = in.readLine(); } catch (IOException e) { } // s="zhang,tony"; ShowFactoryName(s); } static void ShowFactoryName(String input) { System.out.println("input:" + input); nameFact = new NameFactory(); Namer nm = nameFact.getName(input);// 此处可以用反射,类似于getClass方法 System.out.println("FirstName:" + nm.getFrname()); System.out.println("LastName:" + nm.getLname()); } }
正常情况下,分别得出如下结果:
小结:从代码的比较中,大多数情况下,改下大小写,代码就可以通用,只是命名空间可能有较大差异。如果你熟悉c#所有的类,Java是否也感觉很容易呢?
下一篇:《Java是如何快速煮成C#的?》(二):数据访问(1)