解答は earth.mlab.im.dendai.ac.jp の /home/submit/1I-Computer2/[初級の出題日]/[学籍番号] のディレクトリに提出しなさい。 ソースファイル (〜.java) のみを提出すること。
ファイルの送信には ftp ソフトを用いる。 Linux の gFTP を使った提出方法 (実験室のマニュアル) を参照すること。
なお、中級・上級問題は楽しめる範囲で取り組めばよい。
財布を表すクラス Wallet を定義しなさい。 財布にはお金以外にカード類や領収書などを収納する機能があるが、 ここではお金を収納する機能にのみ着目する。
クラス Wallet には、少なくとも以下の属性、メソッドがあるものとする。
クラス Wallet の使用例と実行例は以下の通り。
class PersonWithWallet { public static void main(String[] args) { System.out.println("財布: "); Wallet wallet = new Wallet(); wallet.put(1000); System.out.println("中身は " + wallet.getAmount() + " です。"); wallet.get(10000); System.out.println("中身は " + wallet.getAmount() + " です。"); } } class Wallet { // ここを考える }
$ java PersonWithWallet 財布: 1000 入れました。 中身は 1000 です。 10000 取り出します。 10000 もありません。1000 だけ取り出します。 中身は 0 です。 $
ブタ(pig)の形をした貯金箱(piggy bank)を定義しなさい。 この貯金箱は、お金を収納できるので財布の一種と考えることができるが、 お金を一部だけ取り出すことはできず、壊して全額取り出すことしかできない。
この貯金箱を表すクラス PiggyBank を、 財布を表すクラス Wallet を継承させて作成しなさい。 その際、Wallet に実装されているが Wallet とは動作の異なるメソッドを、 オーバーライドして作成することになる。 例えば、get は常に 0 を返すメソッドにする必要がある。
余力のある人は、一度壊したら (= getAll したら)、 それ以降は put もできないようにすること。
class PersonWithWallet { public static void main(String[] args) { System.out.println("財布: "); Wallet wallet = new Wallet(); wallet.put(1000); System.out.println("中身は " + wallet.getAmount() + " です。"); wallet.get(10000); System.out.println("中身は " + wallet.getAmount() + " です。"); System.out.println(); System.out.println("貯金箱: "); Wallet piggyBank = new PiggyBank(); piggyBank.put(1000); System.out.println("中身は " + piggyBank.getAmount() + " です。"); piggyBank.get(500); System.out.println("中身は " + piggyBank.getAmount() + " です。"); piggyBank.getAll(); System.out.println("中身は " + piggyBank.getAmount() + " です。"); piggyBank.put(10000); } } class Wallet { // ここは問題1-1のものをそのまま使う } class PiggyBank extends Wallet { // ここを考える }
$ java PersonWithWallet 財布: 1000 入れました。 中身は 1000 です。 10000 取り出します。 10000 もありません。1000 だけ取り出します。 中身は 0 です。 貯金箱: 1000 入れました。 中身は 1000 です。 一部だけ取り出すことはできません。 中身は 1000 です。 全額取り出しました。この貯金箱はもう使えません。 中身は 0 です。 入れられません。 $
この問題は上級者向けである。
CDとDVD Videoについて考えよう。 CDには音楽作品(Music)が複数記録されており、 DVD Videoには映像作品(Movie)が複数記録されている。
ここで、音楽作品と映像作品の性質を考えると、 どちらも作者(演奏家)と題名を持つ似たような性質のものだと考えられる。 そこで、まず音楽作品と映像作品に共通する性質を抽出し スーパクラスとして「メディア(Media)」を定義し、 メディアを継承することで「音楽」と「映像」のクラスを定義することが考えられる。 ただし、映像作品には、言語音声の種類や字幕、 視聴可能なリージョン(国や地域)などの情報が含まれているとする。
以上のような考え方に基づき、 メディア (クラス Media)、 音楽 (クラス Music)、 映像 (クラス Movie) を作成しなさい。
ファイル名は VariousMedia.java とし、適当な main メソッドを書くこと。
上で定義したメディアが複数記録できるディスク (クラス Disc) を作成し、 この Disc クラスを継承する形で CD (クラス CompactDisc) 、DVD Video (クラス DVDVideo) を作成しなさい。
ファイル名は CDAndDVD.java とし、適当な main メソッドを書くこと。
上で定義した DVD Video が視聴できる DVD プレーヤを表すクラス DVDPlayer を定義しなさい。 DVD プレーヤでは DVD Video の視聴のみならず CD も演奏可能なものとすること。
ファイル名は DVDWatcher.java とする。 適当な映像作品を題材とした DVD Video および、 適当な音楽作品を題材とした CD を作成し、 視聴できる様子を main メソッドに書くこと。