期待される実行結果通りになってはいるのですが、恐らく出題者の意図はareaを使って解いて欲しいのだと思うのでよりよい解答例がありましたらアドバイスなどほしいです。
下記コードです。
c#
1 2//メインクラス 3class Program 4 { 5 static void Main(string[] args) 6 { 7 // 四角形の生成 8 Box b = new Box(2.0, 4.0); 9 // 三角形の生成 10 Triangle t = new Triangle(4.0, 1.5); 11 Console.WriteLine("幅{0}、高さ{1}の四角形の面積は{2}", b.Width, b.Height, b.Area); 12 Console.WriteLine("幅{0}、高さ{1}の三角形の面積は{2}", t.Width, t.Height, t.Area); 13 } 14 } 15
c#
1 2//四角形クラス 3class Box:PlaneFigure 4 { 5 // コンストラクタ 6 public Box(double width, double height):base(width, height) 7 { 8 9 } 10 11 // 面積の取得 12 public override double Area 13 { 14 get { return Width * Height; } 15 } 16 } 17
c#
1 2//三角形クラス 3class Triangle : PlaneFigure 4 { 5 // コンストラクタ(引数あり) 6 public Triangle(double width, double height):base(width, height) 7 { 8 9 } 10 11 // 面積の取得 12 public override double Area 13 { 14 get { return Width * Height / 2.0; } 15 16 } 17 } 18
C#
1 2//集約クラス 3abstract class PlaneFigure 4 { 5 //面積 (警告で「areaは使用されていません」と表示される) 6 private double area; 7 //幅 8 private double width; 9 //高さ 10 private double height; 11 12 //コンストラクタ 13 public PlaneFigure(double width, double height) 14 { 15 this.width = width; 16 this.height = height; 17 } 18 //幅のプロパティ 19 public double Width 20 { 21 get { return width; } 22 set { width = value; } 23 } 24 25 //高さのプロパティ 26 public double Height 27 { 28 get { return height; } 29 set { height = value; } 30 } 31 32 //面積の抽象プロパティ 33 public abstract double Area 34 { 35 get; 36 } 37 } 38
このような問題は1つずつ段階を踏む方が悩まずに済みます。
teratailは解答例を代わりに書いてもらうサイトではありませんから、解答例を尋ねるのではなく現在躓いている部分を質問に記載してみましょう。
質問に書き途中のコードが記載されていないので、そもそも今は PlaneFigure という抽象クラスが作られていなさそうに見えます。もしかするとそこで躓いているということでしょうか。
そうでなければ、まずは中身は空で構いませんから PlaneFigure クラスを試しに作ってみましょう。
まぁまず「先生が必要ならスクールにでも通え」という話だけども。
> 『PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること。』とあるのですが、widthとheightも共通しているのに必要ないのか?など混乱しています。
「共通しているのに必要ない」っていう表現が意味不明。
「共通して必要だから抽象クラスに宣言しよう」という趣旨でしょ。
> https://csharp.sevendays-study.com/problemex4.html のprobex4-2に書いてある問題です
それを質問欄にコピペしただけの 100% 丸投げ質問は問題外ですよ。自分で答を考えて、それを質問欄に書いて、それに対する意見を求めることをお勧めします。
ところで、丸々コピペして著作権の問題とかはないのですかね?
> widthとheightも共通しているのに必要ないのか?など混乱しています。
何を混乱することがありますか?
求められているのは Box と Triangle の共通の基底クラス PlaneFigure を抽象クラスとして作り、Box と Triangle の共通メンバを基底クラスから派生させること、そして Area は抽象プロパティとすることです。
> これら2つのクラスに共通するメンバを、平面図形(PlaneFigure)クラスに集約し、Boxクラス、およびTriangleクラスは、それらのクラスを継承したものにするように、プログラムを書きかかえなさい。ただし、この時、PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること。
ただの日本語の問題なので、この問題の意味がわからないのであれば最初からやり直しましょう。
width,heightはBox,Triangle共通だからこそ基底でいいのでは?
areaは面積という事なので処理内容(この場合計算式)が変わります。これはvirtualなりabstractなりにしてoverrideして継承したクラスで実装してみよう、というコードを書いてみましょう、という練習問題なのでは
過去の質問を見ても、マルチポスト、多重投稿等で指摘された事に全然対応していないし会話が成り立っていない様子。プログラミングの前に日本語の勉強をした方がよいのでは。
[質問するときのヒント] https://teratail.com/help/question-tips
[推奨していない質問] https://teratail.com/help/avoid-asking
質問にあるURLのサイトは有料で音声・画像付きの有料の講座もあるようで、そちらで解答も入手できるみたいですし、判り難いなら有料の講座を受ければよいのでは?勝手に内容をコピペしてタダで解説と解答を貰おうという浅はかな考えが透けてみえます。
要は「問題文を読むこと自体ができません」って話ですよねこれ.
つまり,純然たる「こくご」の話と見える.
参考までに,意味を取れていない部分:
> これら2つのクラスに共通するメンバを、平面図形(PlaneFigure)クラスに集約し、Boxクラス、およびTriangleクラスは、それらのクラスを継承したものにするように、プログラムを書きかかえなさい。ただし、この時、PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること。
…をGoogle翻訳に食わせたら以下のようになりましたよ.
これでどうですかね?
Rewrite the program so that the members common to these two classes are aggregated into the PlaneFigure class, and the Box class and Triangle class inherit from those classes. However, at this time, the PlaneFigure class should be an abstract class that has the abstract property Area.
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247909106
同じ人かな?
もしそうなら、『マルチポストは非推奨』です。
それと、その問題集での定義が間違っている気がします。
普通、集約というと、has-a関係のため、いわゆるコンポジション(別クラスのオブジェクトをフィールドとして持つやつ)っぽいです。
辛うじてヒントとして出されているものとかでわかりますが、
初見でそういう出題方法だと解ける人がいないです。
だって、2つの意味で取れるから。
一つはコンポジション、もう一つは継承。
今回は継承についてのようです。
皆さんありがとうございます!
なるほど、普通のプロパティと抽象プロパティがごちゃごちゃになっていたので解釈を間違えていたようです。Areaだけは抽象プロパティで記述しろということですね。
抽象クラスの内容を追加します!
警告が出るのは元々そのサイトで提示されているのがウンコードだからです。
一週間で身につくわけがないのに騙される人が結構多いですが。
初心者は公式サイトだけを見るか本を買いましょう。
あと「より良いコード」は知恵袋で示されています。
https://teratail.com/help#posted-otherservice
ここを読んで適切に対応してください。
> 集約
混乱を招かないように専門用語と被る単語の使用を避けた方が良いよね,的な話はわかるけども,とりあえず本件の
> これら2つのクラスに共通するメンバを、平面図形(PlaneFigure)クラスに集約し、Boxクラス、およびTriangleクラスは、それらのクラスを継承したものにするように…
という「文章」を読んだときに,この文章内に含まれている「集約」という語の意味の解釈に迷いが生じる可能性はほぼゼロに等しいと思う.
単に まとめる 程度の意味あいだということは文脈から明確ではなかろうか,と.
(まぁ著しくどうでもいい話ですが)
> 恐らく出題者の意図はareaを使って解いて欲しいのだと思うのでよりよい解答例がありましたらアドバイスなどほしいです。
いや、たぶん何も考えてないと思いますけど。内容も古いし、ちょっとひどすぎ。
警告が気になるならその行をコメントアウトすれば十分でしょう。
個人の勉強で自分でそのサイトを探してみているなら、見ない方が良いです。知恵袋でも言われているように、「こういうので勉強するのなら、書店でマトモな入門書でも買った方がよい」と思います。
もし、研修の課題とかで講師にここを見ろとか言われているなら、講師に文句を言うレベルだと思います。講師が聞く耳持たなければ、その講師の研修はやめた方が良さそうです。
「集約」について、私もfanaさんに同意します。コンポジションと混同するかについては私自身は質問文を読んだときは頭に浮かびませんでしたね。まぁ、これも個人的な意見に過ぎませんが。(結局どうでもよい)
未使用のフィールド area が存在しているコードが話の出発点になっているならば,
そもそもその大元のコードの時点でもその警告が出ているはずである.
↓
このフィールド area が無意味に存在することの意図は不明であるけれども,
そこに何らかの意図が存在しているのだと見なし,且つ,その意図を律儀に尊重しようというのであれば,
あなたが書き換えた結果のコードでも同じ警告が出る状態こそが正当なのだと考えることもできるのではあるまいか.
---
どうでもいい差異を指摘するならば,大元のコードでは =0 として値が明記してある模様.
これにより出てくる警告の文言が微妙に異なるかもしれない.
回答2件
あなたの回答
tips
プレビュー