メソッドのオーバーロード

クラスを使っていると、メソッド名が同じにもかかわらず、引数の数や引数の型が異なるメソッドがあります。これをメソッドのオーバーロードと言います。
例)

MessageBox.Show("hello world!");
MessageBox.Show("hello world!", "HelloDialog");

メソッドのオーバーロードは簡単です。また、引数の数が同じで、引数の型が異なるメソッドをオーバーロードすることもできます。
オーバーロード機能があることで、クラスを使う側も作る側も楽ができます。

using System;

namespace Sample {
	class Program {
		static void Main(string[] args){
			DateUtility du = new DateUtility ();
			// IsEndOfMonth(DateTime date)を呼び出す
			DateTime date = new DateTime(2011, 5, 30);
			bool eom1 = du.IsEndOfMonth (date);
			Console.WriteLine (eom1 == true ?
					"月末です" :
				"月末ではありません");
			// IsEndOfMonth(int year, int month, int day)を呼び出す
			bool eom2 = du.IsEndOfMonth(2011,2,28);
			Console.WriteLine (eom2 == true ?
				"月末です" :
				"月末ではありません");
			Console.ReadLine ();
		}
	}

	class DateUtility {
		public bool IsEndOfMonth(DateTime date){
			Console.WriteLine ("Call IsEndOfMonth(DateTime date)");
			return date.AddDays(1).Day == 1;
		}

		public bool IsEndOfMonth(int year, int month, int day){
			Console.WriteLine ("Call IsEndOfMonth(int year, int month, int day)");
			DateTime date = new DateTime (year, month, day);
			return IsEndOfMonth (date);

		}
	}
}

書籍を扱うクラス

規模が大きなプログラムを作るには、クラスの理解が必須。
とのことで、C#でのクラスを見てみましょう。

using System;

namespace ConsoleApplication1 {
	class Program {
		static void Main(string[] args){
			Book[] books = new Book[2];
			books[0] = new Book {
			title = "伊豆の踊り子",
			author = "川端康成",
			price = 380,
			publisher = "新潮社"
			};
			books [1] = new Book {
				title = "坊ちゃん",
				author = "夏目漱石",
				price = 378,
				publisher = "岩波書店"
			};
			foreach (Book book in books)
				Console.WriteLine ("{0} {1} {2} {3}",
					book.title, book.author,
					book.price, book.publisher);
			Console.ReadLine();
		}
	}

	class Book {
		public string title;
		public string author;
		public int price;
		public string publisher;
	}
}

簡易sleepコマンド

#include < time.h >
#include < stdio.h >
#include < stdlib.h >

int main(int argc, char **argv)
{
    struct timespec req;
    char *end;
    
    if(
        argc != 2 ||
       argv[1][0] == '\0' ||
       (req.tv_sec = strtol(argv[1], &end, 10), *end != '\0')
       ) {
        fprintf(stderr, "Usage: %s seconds \n", argv[0]);
        return 1;
    }
    
    req.tv_nsec = 0;
    
    if (nanosleep(&req, NULL) < 0){
        perror("naosleep");
        return 1;
    }
    return 0;
}

whoamiコマンド

getpwuid()を使います。

#include < unistd.h >
#include < sys/types.h >
#include < pwd.h >
#include < stdio.h >

int main(){
    pid_t euid;
    struct passwd *pw;

    euid = geteuid();

    if((pw = getpwuid(euid))== NULL){
        printf("%d\n", (int)euid);
    } else {
        printf("%s\n", pw->pw_name);
    }
    return 0;
}

簡易touchコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < utime.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for (i = 1; i < argc; i++){
        open (argv[i], O_WRONLY|O_CREAT, 0666);
        
        if (utime(argv[i], NULL)){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易rmコマンド

#include < unistd.h >
#include < stdio.h >

int main(int argc, char ** argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for (i = 1; i < argc; i++){
        if (unlink(argv[i]) < 0){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易mkdirコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int i;
    int err = 0;
    
    if (argc <= 1){
        fprintf(stderr, "Usage: %s file...\n", argv[0]);
        return 1;
    }
    
    for(i = 1; i < argc; i++){
        if(mkdir(argv[i], 0777)<0){
            perror(argv[i]);
            err = 1;
        }
    }
    return err;
}

簡易lnコマンド

ln -s source destとln source destの形式に対応。

#include < unistd.h >
#include < stdio.h >
#include < string.h >

int main(int argc, char **argv)
{
    int s_flag;
    
    if (
        argc <= 2 || argc >= 5 ||
        (s_flag = (strcmp(argv[1], "-s")==0), argc == 3 && s_flag)|| (argc == 4 && !s_flag))
    {
        fprintf(stderr, "Usage: %s [-s] source dest\n", argv[0]);
        return 1;
    }
    if (s_flag){
        if (symlink(argv[2], argv[3]) < 0){
            perror("symlink");
            return 1;
        }
    } else {
        if (link(argv[1], argv[2])< 0){
            perror("link");
            return 1;
        }
    }
    return 0;
}

簡易cp -pコマンド

コピー元のファイルのタイムスタンプ、ファイル所有者、ファイルモードをコピー先のファイルに設定。

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >
#include < utime.h >
#include < stdio.h >

int main(int argc, char **argv)
{
    int fd_r, fd_w;
    ssize_t n;
    int err = 0;
    struct stat s_buf;
    struct utimbuf u_buf;
    char buf[4096];
    
    if (argc != 3){
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }
    
    if ((fd_r = open(argv[1], O_RDONLY)) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if (fstat(fd_r, &s_buf) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if ((fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){
        perror(argv[2]);
        return 1;
    }
    
    while((n = read(fd_r, buf, sizeof buf)) > 0){
        if (write(fd_w, buf, n)< 0){
            perror(argv[2]);
            return 1;
        }
    }
    if (n < 0){
        perror(argv[1]);
        return 1;
}
    u_buf.actime = s_buf.st_atime;
    u_buf.modtime = s_buf.st_mtime;
    
    if (utime(argv[2], &u_buf)){
        perror(argv[2]);
        err = 1;
    }
    
    fchown(fd_w, s_buf.st_uid, s_buf.st_gid);
    
    if (fchmod(fd_w, s_buf.st_mode)<0){
        perror(argv[2]);
        err = 1;
    }
    return err;
}

簡易cpコマンド

#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >
#include < stdio.h >

int main (int argc, char ** argv)
{
    int fd_r, fd_w;
    ssize_t n;
    char buf[4096];
    
    if (argc != 3){
        fprintf(stderr, "Usage: %s source dest\n", argv[0]);
        return 1;
    }
    
    if ((fd_r = open(argv[1], O_RDONLY)) < 0){
        perror(argv[1]);
        return 1;
    }
    
    if ((fd_w = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0){
        perror(argv[2]);
        return 1;
    }
    while ((n = read(fd_r, buf, sizeof buf)) > 0){
        if(write(fd_w,buf, n)< 0){
            perror(argv[2]);
            return 1;
        }
    }
    if (n < 0){
        perror(argv[1]);
        return 1;
    }
    return 0;
}