Java是如何快速煮成C 的 (一) 相似的方法 2

本文通过工厂模式深入对比了C#与Java两种语言的相似性和差异,详细解析了如何在两种语言中实现相同的模式,包括类的定义、继承、方法调用等,展示了在不同语言环境下代码的互通性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

在上篇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)

 

邀月注:本文版权由邀月和优快云共同所有,转载请注明出处。
助人等于自助!   3w@live.cn



 

 

 

           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值