初心者なのですが困っています。
以下のコードを実行したとき、実行例が表示されるように必要なクラスを作成せよ。
また、それらをカプセル化し、それを使用するよう以下のコードを修正せよ。カプセル化に関わる部分以外修正しないこと。
public class sanple{
public static void main(String[] args){
Employee[] emp=new Employee[4];
emp[0]=new Shain();
emp[0]=new Kacho();
emp[0]=new Bucho();
emp[0]=new Syacho();
for(int i=0;i<imp[i].length;i++){
System.out.println(emp[i].grade+":"+emp[i].salary);
}
}
}
かなり困ってます。どうか回答お願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
よく問題を見たら、「カプセル化に関わる部分を修正せよ」とありますね。
では、回答例として。
public class Employee {
private String grade; ----------------- (1)
private int salary;
public String getGrade() { ------------- (2)
return grade;
}
public int getSalary() {
return salary;
}
protected void setGrade(String grade) { -----(3)
/* 必要ならここでチェックを入れる */
this.grade = grade;
}
protected void setSalary(int salary) {
/* 必要ならここでチェックを入れる */
this.salary = salary;
}
}
public class Shain extends Employee {
Shain(){
setGrade("社員");
setSalary(20000);
}
}
public class Sample{
public static void main(String[] args){
Employee[] emp = new Employee[4];
emp[0]=new Shain();
emp[1]=new Kacho();
emp[2]=new Bucho();
emp[3]=new Syacho();
for(int i = 0 ; i < emp.length ; i++ ) { -------------(ex)
System.out.println(emp[i].getGrade()+":"+emp[i].getSalary()); --(4)
}
}
}
出題者の意図としてはこんな回答を期待してるんじゃないでしょうかねぇ。
不親切な解説をします。
(1) private で、このクラス以外からは手を出せないようにする。
(2) public のメソッドを用意することで、外部から値を取り出すことだけはできるようにする。
(3) 値設定のメソッドを protected にすることで、同一クラス、同一パッケージ、子孫クラスからの値設定を許可する。
(4) 直接メンバ変数を参照していたものを、メソッドを介して取得するように変更。
(ex) 問題の本質と関係なさそうな間違いがあったので、直しました。
何カ所か修正してあるので、そのまま出すとバレるかも知れないですよ。
ところで、何人かの方がすでにヒントや解答を示されています。
public とか protected とか abstruct とか enum とか、いろいろと細かいところが違いますよね。
これは「同じものでも人によって作り方が違うから」というよりも、想定している状況が違うからです。
このメンバ変数はどこまで見せるのか、このメソッドはどこまで共通なのか、このクラスのインスタンス生成は意味を成すのか。
それぞれの方がそれぞれに方針を決めているので、それぞれのソースができあがっているのです。
だから、誰のものがいちばん良いということはありません。
良さそうな所をツギハギするのも意味がないです。
どんなソースができるかは、どんな設計にするかで決まります。
ですから、これらのソースを見て、「これが答えだ」なんて思わないでください。
「ソースに込められた思想」を読み取って欲しいと切に願います。
No.5
- 回答日時:
public class sanpleに間違いがあるような気がするので、もう一度確認してあげてもらえませんか?
特に、
>System.out.println(emp[i].grade+":"+emp[i].salary);
の部分が
System.out.println(emp[i].grade()+":"+emp[i].salary());
なんじゃないかと思うんです。
カプセル化の割に直接メンバ変数をアクセスさせていて、それじゃカプセル化じゃないよ、と突っ込みたくなるのですが。
No.4
- 回答日時:
実にイジワルな課題ですね。
・Employee というクラスを継承しなければならない。
=>言われなくても「継承」が必要だということがわかってないといけない。
・カプセル化しないといけない。
=>カプセル化がわかってないといけない。
・カプセル化に関わる部分以外修正しないこと。とあるが、mainメソッドにも問題がある。
4つの行で明らかなマチガイがあります。 (関係ないが、sanpleという英語からして「もしかして:」って感じです。)
=>実際に実行確認するために、コード修正が必要。
#2さんがいいとことまでヒントをくれていますが、たぶんこの課題の目的は、
"「カプセル化」したクラスの作成と、その呼び出し"
というなので、
emp[i].grade の部分なんか、Shainクラスのフィールドに直接アクセスするのではなく、
「カプセル化」されたクラスとして、Shainクラスに、gradeの値を返却するpubulicな"メソッド"を
用意して、そのメソッドを呼ぶことにより、値を取得せねばなりません。
emp[i].getGrade() みたいに。
そのため、クラスの書き方も一から考え直さなくてはいけません。
// Employeeクラス(抽象クラス)
abstract class Employee{
private String grade ="";
private String salary ="";
public String getGrade(){
return grade;
}
public String getSalary(){
return salary;
}
}
// Employeeクラスを継承したShainクラス
// ※同様に、Kacho、Bucho、Syachoクラスの作成も必要です。
class Shain extends Employee{
private String grade = "社員";
private String salary = "200000円";
Shain(){
System.out.println("理解するまで提出してはダメです");
}
public String getGrade(){
return grade;
}
public String getSalary(){
return salary;
}
}
//修正後のメインクラス
public class sample {
public static void main(String[] args) {
Employee [] emp = new Employee[4];
emp[0]=new Shain();
emp[1]=new Kacho();
emp[2]=new Bucho();
emp[3]=new Syacho();
for(int i=0;i<emp.length;i++){
System.out.println(emp[i].getGrade() +":"+emp[i].getSalary());
}
}
}
ってな感じでしょうか。
クラスの継承、カプセル化、カプセル化する理由について、
本などを理解できるまでじっくり読んでみてください。
ちなみに、このコード、そのままコピペして提出すると
ダメなメッセージがでるようにしときました。(w
No.3
- 回答日時:
abstract class Employee {
//社員クラス
static enum 役職 {
平社員,係長,課長,部長,専務,社長;
}
static protected long seq = 0;
protected String name; //名前
protected long id; //社員番号
protected 役職 grade; //役職
protected int salary; //給与
protected int allowance;//手当
public Employee(){}
public Employee(String name){
this.name = name;
this.id = ++seq;
}
abstract String getGrade();
abstract int getSalary();
void print(){
System.out.println(" 名前:" + name);
System.out.println("社員番号:" + id);
System.out.println(" 役職:" + grade);
System.out.println(" 給料:" + this.getSalary());
}
}
class Shain extends Employee{
public Shain(String name, int salary){
super(name);
grade=役職.平社員;
this.salary=salary;
}
public String getGrade(){
return "社員";
}
public int getSalary(){
return salary + allowance;
}
}
class Kacho extends Employee{
public Kacho(String name, int salary){
super(name);
grade=役職.課長;
this.salary=salary;
}
public String getGrade(){
return "課長";
}
public int getSalary(){
return salary + allowance;
}
}
class Bucho extends Employee{
public Bucho(String name, int salary){
super(name);
grade=役職.部長;
this.salary=salary;
}
public String getGrade(){
return "部長";
}
public int getSalary(){
return salary + allowance;
}
}
class Syacho extends Employee{
public Syacho(String name, int salary){
super(name);
grade=役職.社長;
this.salary=salary;
}
public String getGrade(){
return "社長";
}
public int getSalary(){
return salary + allowance;
}
}
public class Sample {
public static void main(String[] args){
Employee[] emp = new Employee[4];
emp[0]=new Shain("小澤 マリア", 200000);
emp[1]=new Kacho("高井 桃" , 300000);
emp[2]=new Bucho("水嶋 彩" , 400000);
emp[3]=new Syacho("笠木 忍" , 500000);
for(int i=0;i<emp.length;i++){
System.out.println(emp[i].getGrade() + ":" + emp[i].getSalary()+ "円");
// emp[i].print();
}
}
}
No.2
- 回答日時:
emp[0]=new Shain();
のようになっているから、
Shain、Kacho, Bucho, Syacho クラスは、Employee クラスを継承する必要があります。
また、
emp[i].grade+":"+emp[i].salary
となっているから、 employee クラスにgrade、salary というフィールドが (恐らく) public で宣言されている必要があります。
派生クラスのコンストラクタ内で、基底クラスのフィールドを初期化するために基底クラスのパラメータを持ったコンストラクタを呼び出します。
例えば以下のような感じ。
class Employee{
public String grade;
public int salary;
public Employee(String sVal, int iVal){
grade = sVal;
salary = iVal;
}
}
class Shain extends Employee{
public Shain (){
super("社員", 200000);
}
}
残りの Kacho, Bucho, Shacho クラスも Shain クラス同様に作成します。
後は自力で・・・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- Java java final 1 2022/06/10 22:49
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java eclipse実行ができない 2 2022/07/27 04:47
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
関数内の変数に<summary>コメン...
-
C++でfriendクラスにしているの...
-
C#にて別クラスの関数を使いたい
-
visual studioのデザイナ画面で...
-
import と extends について
-
(クラス名.this.メソッド)って...
-
Java リフレクションについて
-
ClassLoader.getSystemResource...
-
C#で処理中の状況をStatusLabel...
-
親クラスから子クラスへアクセス。
-
スーパークラスのコンストラク...
-
構造 他のクラスの構造体を別...
-
java-別クラスの変数の使い方を...
-
iアプリでの関数の計算について
-
C#のクラスライブラリでメッセ...
-
アブストラクトとインターフェ...
-
javaの配列について質問です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
ひとつのファイルにクラスは1つ?
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C# log4netの使い方
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
オブジェクトのデータをもとにX...
おすすめ情報