質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2530閲覧

C# より良い書き方があひましたら教えて欲しいです

pofinpouty

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2021/08/18 17:14

編集2021/08/19 03:24

https://csharp.sevendays-study.com/problemex4.htmlのprobex4-2に書いてある問題で、下記のように記述したのですが、警告で『areaは使用されていません』と表示されています。

期待される実行結果通りになってはいるのですが、恐らく出題者の意図は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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2021/08/18 18:53 編集

このような問題は1つずつ段階を踏む方が悩まずに済みます。 teratailは解答例を代わりに書いてもらうサイトではありませんから、解答例を尋ねるのではなく現在躓いている部分を質問に記載してみましょう。 質問に書き途中のコードが記載されていないので、そもそも今は PlaneFigure という抽象クラスが作られていなさそうに見えます。もしかするとそこで躓いているということでしょうか。 そうでなければ、まずは中身は空で構いませんから PlaneFigure クラスを試しに作ってみましょう。
gentaro

2021/08/18 19:48

まぁまず「先生が必要ならスクールにでも通え」という話だけども。 > 『PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること。』とあるのですが、widthとheightも共通しているのに必要ないのか?など混乱しています。 「共通しているのに必要ない」っていう表現が意味不明。 「共通して必要だから抽象クラスに宣言しよう」という趣旨でしょ。
退会済みユーザー

退会済みユーザー

2021/08/18 21:57

> https://csharp.sevendays-study.com/problemex4.html のprobex4-2に書いてある問題です それを質問欄にコピペしただけの 100% 丸投げ質問は問題外ですよ。自分で答を考えて、それを質問欄に書いて、それに対する意見を求めることをお勧めします。 ところで、丸々コピペして著作権の問題とかはないのですかね?
Zuishin

2021/08/18 22:06 編集

> widthとheightも共通しているのに必要ないのか?など混乱しています。 何を混乱することがありますか? 求められているのは Box と Triangle の共通の基底クラス PlaneFigure を抽象クラスとして作り、Box と Triangle の共通メンバを基底クラスから派生させること、そして Area は抽象プロパティとすることです。 > これら2つのクラスに共通するメンバを、平面図形(PlaneFigure)クラスに集約し、Boxクラス、およびTriangleクラスは、それらのクラスを継承したものにするように、プログラムを書きかかえなさい。ただし、この時、PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること。 ただの日本語の問題なので、この問題の意味がわからないのであれば最初からやり直しましょう。
退会済みユーザー

退会済みユーザー

2021/08/19 00:14

width,heightはBox,Triangle共通だからこそ基底でいいのでは? areaは面積という事なので処理内容(この場合計算式)が変わります。これはvirtualなりabstractなりにしてoverrideして継承したクラスで実装してみよう、というコードを書いてみましょう、という練習問題なのでは
退会済みユーザー

退会済みユーザー

2021/08/19 01:02 編集

過去の質問を見ても、マルチポスト、多重投稿等で指摘された事に全然対応していないし会話が成り立っていない様子。プログラミングの前に日本語の勉強をした方がよいのでは。 [質問するときのヒント] https://teratail.com/help/question-tips [推奨していない質問] https://teratail.com/help/avoid-asking 質問にあるURLのサイトは有料で音声・画像付きの有料の講座もあるようで、そちらで解答も入手できるみたいですし、判り難いなら有料の講座を受ければよいのでは?勝手に内容をコピペしてタダで解説と解答を貰おうという浅はかな考えが透けてみえます。
fana

2021/08/19 01:12

要は「問題文を読むこと自体ができません」って話ですよねこれ. つまり,純然たる「こくご」の話と見える. 参考までに,意味を取れていない部分: > これら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.
BeatStar

2021/08/19 02:24

それと、その問題集での定義が間違っている気がします。 普通、集約というと、has-a関係のため、いわゆるコンポジション(別クラスのオブジェクトをフィールドとして持つやつ)っぽいです。 辛うじてヒントとして出されているものとかでわかりますが、 初見でそういう出題方法だと解ける人がいないです。 だって、2つの意味で取れるから。 一つはコンポジション、もう一つは継承。 今回は継承についてのようです。
pofinpouty

2021/08/19 03:14

皆さんありがとうございます! なるほど、普通のプロパティと抽象プロパティがごちゃごちゃになっていたので解釈を間違えていたようです。Areaだけは抽象プロパティで記述しろということですね。 抽象クラスの内容を追加します!
Zuishin

2021/08/19 03:45 編集

警告が出るのは元々そのサイトで提示されているのがウンコードだからです。 一週間で身につくわけがないのに騙される人が結構多いですが。 初心者は公式サイトだけを見るか本を買いましょう。
fana

2021/08/19 03:52

> 集約 混乱を招かないように専門用語と被る単語の使用を避けた方が良いよね,的な話はわかるけども,とりあえず本件の > これら2つのクラスに共通するメンバを、平面図形(PlaneFigure)クラスに集約し、Boxクラス、およびTriangleクラスは、それらのクラスを継承したものにするように… という「文章」を読んだときに,この文章内に含まれている「集約」という語の意味の解釈に迷いが生じる可能性はほぼゼロに等しいと思う. 単に まとめる 程度の意味あいだということは文脈から明確ではなかろうか,と. (まぁ著しくどうでもいい話ですが)
退会済みユーザー

退会済みユーザー

2021/08/19 04:43

> 恐らく出題者の意図はareaを使って解いて欲しいのだと思うのでよりよい解答例がありましたらアドバイスなどほしいです。 いや、たぶん何も考えてないと思いますけど。内容も古いし、ちょっとひどすぎ。 警告が気になるならその行をコメントアウトすれば十分でしょう。 個人の勉強で自分でそのサイトを探してみているなら、見ない方が良いです。知恵袋でも言われているように、「こういうので勉強するのなら、書店でマトモな入門書でも買った方がよい」と思います。 もし、研修の課題とかで講師にここを見ろとか言われているなら、講師に文句を言うレベルだと思います。講師が聞く耳持たなければ、その講師の研修はやめた方が良さそうです。
dodox86

2021/08/19 04:55

「集約」について、私もfanaさんに同意します。コンポジションと混同するかについては私自身は質問文を読んだときは頭に浮かびませんでしたね。まぁ、これも個人的な意見に過ぎませんが。(結局どうでもよい)
fana

2021/08/19 05:08 編集

未使用のフィールド area が存在しているコードが話の出発点になっているならば, そもそもその大元のコードの時点でもその警告が出ているはずである. ↓ このフィールド area が無意味に存在することの意図は不明であるけれども, そこに何らかの意図が存在しているのだと見なし,且つ,その意図を律儀に尊重しようというのであれば, あなたが書き換えた結果のコードでも同じ警告が出る状態こそが正当なのだと考えることもできるのではあるまいか. --- どうでもいい差異を指摘するならば,大元のコードでは =0 として値が明記してある模様. これにより出てくる警告の文言が微妙に異なるかもしれない.
guest

回答2

0

ベストアンサー

恐らく出題者の意図はareaを使って解いて欲しいのだと思う

「ただし、この時、PlaneFigureクラスは、抽象プロパティAreaを持つ抽象クラスとすること」と書いてあるぐらいで、フィールドを使えとは書いていないので正確な意図は汲みとれません。
課題なら、課題を出した人に意図を確認してください。

個人的にはわざわざフィールドを利用することに拘る必要はないと思います。

余談

Width や Height に関しては単純な get, set で構成されていますから自動プロパティが使えます。
自動プロパティを使うことで今回の場合は width や height などの private なメンバー変数を定義する必要がなくなり、記述量が少なくなります。知っておいて損はないでしょう。

自動プロパティの定義の仕方については、そちらの記事に拘るなら 自動実装プロパティ(ページの下の方) を参照してください。
※上記の記事だけでは説明が端的すぎるように感じるので、自動プロパティ も目を通しておくと理解がより深められると思います

投稿2021/08/19 04:11

編集2021/08/19 04:27
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2021/08/19 04:33

あとは get-only プロパティも使えますね。
BluOxy

2021/08/19 04:39

pofinpouty さんが貼ったリンクのサイトに1つ異議を挙げるなら、せっかく自動プロパティのことを事前に解説しているなら、問題文にもそれを使うべきだと思いました。 「冗長的なコードを省略しなさい」というような問題でない限り、わざわざ冗長的なコードを問題に掲示する必要がないので。
BluOxy

2021/08/19 05:15 編集

かといって、「そのサイトの代わりに本来はこういうサイトを見てハンズオントレーニングするべき」という代替案が思いつかなかったので、あくまで異議止まりにはなってしまいます。 問題自体の荒に気づくには世の中で信頼されているドキュメントを読む習慣をつけ、正しい C# の知識をつけることが大事です。 ですから、そのサイトに書いてある情報だけを決して鵜呑みにはせず、他のドキュメントと照らし合わせてみましょう。 > 世の中で信頼されているドキュメント いくつか紹介するなら先ほどもリンクに貼った https://ufcpp.net/study/csharp/ はお勧めです。 C#界の著名な方が書いており、現在もメンテナンスされています。 Mircosoft のドキュメント https://docs.microsoft.com/ja-jp/dotnet/csharp/ も正確な情報を得るのにお勧めです。
guest

0

// 面積
private double area = 0;

Areaって面積のことなの?

ってとこらへんからやり直そう

投稿2021/08/18 21:44

編集2021/08/18 21:52
y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/08/18 21:50

回答になってないことを回答欄に書くのはやめましょう。
Zuishin

2021/08/18 21:56

この回答が何なのかまるで意味がわかりません。 求められているのは area というプライベートフィールドではなく Area という抽象プロパティです。 (Area が抽象プロパティである必然性は無いと思いますが、抽象クラスの練習問題なのでしょう)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問