zoukankan      html  css  js  c++  java
  • 《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;

    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)

  • 相关阅读:
    (收藏)基于.net开发平台项目案例集锦
    记录:在ASP.NET中使用ActiveX插件时遇到的问题
    [转]三种邮件服务器的比较
    (收藏)30岁,开始实现我的程序员梦
    [转]加密狗原理介绍
    从临时表返回数据时遇到的问题(ORA08103: object no longer exists)
    Response.Flush的使用心得
    C#编程向VFP数据库中插入Numeric型的值(foxpro,dbf)
    [转]Web部件错误:此网页存在致命错误
    Win2003Server出现了很多的“桌面”
  • 原文地址:https://www.cnblogs.com/downmoon/p/1826260.html
Copyright © 2011-2022 走看看