Logic Delight

明日のワシは忘れてしまうから、コードにはコメントを書くのです。

Java経験者のための、C#のキャッチ・アップ用小ネタ集(第3回)

更新が滞っておりましたが、小出しの続きですな。読者の方には全く関係ありませんが、実は予定を変更してお届けしております。

基本的な部分での、Javaとの違い。

Javaでは1ソースファイルに1つのpublicクラスという制約があるが、C#では縛りなし

Javaで言うところの package (パッケージ) は、C#では namespace (名前空間)

見慣れたJavaでは、こんな感じ。2つ目のpublicクラスが定義されていると、コンパイルエラーで怒られた気がする、確か。

// MyClass.java
package jp.ne.skyblue.myapp;

public class MyClass {

    public void hoge() {
        System.out.println("Say Hoge!");
    }

}

C#では、クラスをいくつでも定義できちゃう。
おそらく、繋がりが深い同類のクラス群は、同時に参照・メンテされることが多いだろうから、まとめてもいいよ的な考えなのかしら?と思うのですが、javaっぽくクラス名でファイルを探しても一向に見つからないのでgrepかけることになることも・・・。

// MyClasses.cs
using System;

namespace jp.ne.skyblue.myapp
{
    public class MyClassA
    {
        public void Hoge() {
            Console.WriteLine("Say Hoge!");
        }
    }

    public class MyClassB
    {
        public void Fuga() {
            Console.WriteLine("Say Fuga!");
        }
    }
}

なんにせよ節度と秩序を保ちつつ、クラスは定義していきたいものですな。

Javaで言うところのJavadocは、C#で言うところのXML Documentというもの

ま、ドキュメントコメントを書かないと、後々自分を含め色々な関係各位が困ったことになりますよね。あと、書いてあるけどわかりにくかったり、嘘ついていたり、とか世の中には様々な罠がありますが、そんなことに絶望することなく、真摯な気持ちで未来の自分のために書くことを心がけたいところですな。

// MyClass.java
package jp.ne.skyblue.myapp;

/**
 * 俺の俺による俺のためのクラス。
 */
public class MyClass {

    /**
     * Hoge って言えって言う。
     *
     * @param message 付加するメッセージ
     * @return 言った後の気持ち
     */
    public Feeling hoge(String message) {
        System.out.println("Say Hoge! and " + message);

        return Feeling.GOOD;
    }

}

んで、XML Documentがコチラ。

// MyClasses.cs
using System;

namespace jp.ne.skyblue.myapp
{
    /// <summary>
    /// 俺の俺による俺のためのAクラス。
    /// </summary>
    public class MyClassA
    {
        /// <summary>
        /// Hoge って言えって言う。
        /// </summary>
        /// <param name="message">付加するメッセージ</param>
        /// <returns>言った後の気持ち</returns>
        public Feeling Hoge(string message) {
            Console.WriteLine("Say Hoge! and " + message);

            return Feeling.GOOD;
        }
    }

    /// <summary>
    /// そしてBクラス。
    /// </summary>
    public class MyClassB
    {
        /// <summary>
        /// Fuga って言えって言う。
        /// 
        /// ※フガって言うので精一杯だから、文字列を付加したり気持ちを返したりしません。
        /// </summary>
        public void Fuga() {
            Console.WriteLine("Say Fuga!");
        }
    }
}

下記のサイトに真面目な違いが書いてあるので、真面目な人はそちらをお読み下さい。

(参考サイト)
XML Document (C# によるプログラミング入門)

継承や実装は全てコロン(:)で表す

Javaのようなオブジェクト指向言語では、継承(extend)やインターフェースの実装(implement)は必要不可欠でありますな。

// Renewable.java
package jp.ne.skyblue.myapp;

/**
 * 再生可能であることを表すインターフェース。
 */
public interface Renewable {
    /**
     * (何度でも)再生します。
     */
    void renew();
}

// Terminator.java
package jp.ne.skyblue.myapp;

/**
 * 新型ターミネーターを表すクラス。
 */
public class Terminator implements Renewable {
    /**
     * @see jp.ne.skyblue.myapp.Renewable#renew()
     */
    public void renew() {
        // do something.
    }
}

// ArnoldSchwarzenegger.java
package jp.ne.skyblue.myapp;

/**
 * シュワちゃんを表すクラス。
 */
public class ArnoldSchwarzenegger extends Terminator {
    /**
     * @see jp.ne.skyblue.myapp.Renewable#renew()
     */
    @Override
    public void renew() {
        // I'll be back!
        super.renew();
    }
}

C#では、extends とか implements とか言わせずに、『漢は黙ってコロン!』という心意気のようです。
ワシのようなTOEIC難民が英単語を覚える僅かなチャンスを削らんとしているのか、或いは少しでもコード量タイピング量を減らして何かの速度を上げたり何かの効率を上げたりしようとしているのか。その意図はワシにはわかりません。

// MyClasses.cs
using System;

namespace jp.ne.skyblue.myapp
{
    /// <summary>
    /// 再生可能であることを表すインターフェース。
    /// </summary>
    public interface IRenewable
    {
        /// <summary>
        /// (何度でも)再生します。
        /// </summary>
        void Renew();
    }

    /// <summary>
    /// 新型ターミネーターを表すクラス。
    /// </summary>
    public class Terminator : IRenewable
    {
        /// <summary>
        /// <see cref="IRenewable.Renew"/>
        /// </summary>
        public virtual void Renew() {
            // do something.
        }
    }

    /// <summary>
    /// シュワちゃんを表すクラス。
    /// </summary>
    public class ArnoldSchwarzenegger : Terminator
    {
        /// <summary>
        /// <see cref="IRenewable.Renew"/>
        /// </summary>
        public override void Renew() {
            // I'll be back!
            base.Renew();
        }
    }
}

とまぁ・・・、最後の方どーでもよくなってきていないですよ。これでも精一杯真面目に書いておりますよ。ということで不定期に続きますので宜しくお願いします。