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

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

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

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

Q&A

解決済

2回答

6766閲覧

modelクラスの継承、省略方法は?

meshkit

総合スコア72

C#

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

0グッド

1クリップ

投稿2018/01/09 06:57

###前提・実現したいこと
C#を使って、csvファイルを出力するプログラムを書いています。
ファイルの種類が多いので、種類ごとに出力する項目のModelClassを作ることを考えました。

###該当のソースコード

C#

1namespace CSVOutput.Models 2{ 3 public class AModel 4 { 5 public string ProductNumber { get; set; } 6 public string Color { get; set; } 7 public string Size { get; set; } 8 public string Price { get; set; } 9 public string ProductName { get; set; } 10 } 11 12 public class BModel 13 { 14 public string ProductNumber { get; set; } 15 public string Color { get; set; } 16 public string ProductName { get; set; } 17 } 18 19 public class CModel 20 { 21 public string ProductNumber { get; set; } 22 public string Size { get; set; } 23 public string ProductName { get; set; } 24 } 25}

のようにcsvの出力ごとにclassを作る場合、

C#

1namespace CSVOutput.Models 2{ 3 public class BASEModel 4 { 5 public string ProductNumber { get; set; } 6 public string ProductName { get; set; } 7 } 8 9 public class AModel:BASEModel 10 { 11 public string Color { get; set; } 12 public string Size { get; set; } 13 public string Price { get; set; } 14 } 15 public class BModel:BASEModel 16 { 17 public string Color { get; set; } 18 } 19 20 public class CModel:BASEModel 21 { 22 public string Size { get; set; } 23 } 24}

のように継承して作るのはありでしょうか?

これはBASEModelに足していますが、継承して減らすことは可能でしょうか?
方法を教えてください。

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2015 Pro, .NET Framework 4.6.2

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

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

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

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

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

guest

回答2

0

ベストアンサー

クラスを継承してCSV毎にサブクラスを作成することは問題ないと思います。

クラスを継承する場合、基底クラスのメンバにアクセスできないようにする(meshkit様のおっしゃる減らすということ)はできません。
ただし、インテリセンスに表示させなくしたり、例外を投げるなどして事実上使えなくするということは可能です。
"C# 継承 隠す"などで検索していただければ、情報が見つかると思います。
※ "隠蔽"で検索するとC#では別の用語としてヒットしますので、お気を付けください。

投稿2018/01/10 02:15

g_uo

総合スコア212

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

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

meshkit

2018/01/10 05:45

キーワードありがとうございます。ばっちりでした。 [BrowsableAttribute(false), EditorBrowsable(EditorBrowsableState.Never)] public new object TestPropertyA { set { throw new Exception(); } get { return null; throw new Exception(); } } あたりでいってみます。
guest

0

昔書いたちょい記事 Entity Frameworkのモデルファーストのちょいテク

継承は、コピペを上手に行っているというものなので、アリですよ。

これはBASEModelに足していますが、継承して減らすことは可能でしょうか?

菱形継承ってやつですね。インターフェースを使う。この記事を読もう。 インターフェースを「契約」として見たときの問題点

こういう感じにするのが正しいのですかね。この規模だと、労多くして・・という感じがしますがw

namespace CSVOutput.Models { public class BASEModel { public string ProductNumber { get; set; } public string ProductName { get; set; } } public interface IColor { string Color { get; set; } } public interface ISize { string Size { get; set; } } public class AModel : BASEModel, IColor, ISize { public string Color { get; set; } public string Size { get; set; } public string Price { get; set; } } public class BModel : BASEModel, IColor { public string Color { get; set; } } public class CModel : BASEModel, ISize { public string Size { get; set; } } }

なお、CSVを書きだすなら、手前味噌ですが、これが便利ですよ。 Attributeを使って、IEnumerable<T>をTSV形式に変換する

投稿2018/01/09 13:59

kiichi54321

総合スコア1984

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

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

meshkit

2018/01/10 01:04

ありがとうございます。 規模は質問用のもので、実際にはもう少し大きいです。30変数*10モデルくらいです。 modelに関して極めて有効なアドレスありがとうございます。 安心してmodel作れます。 インターフェースですが、ご示唆いただいた記事や、手元の書籍などを読み、すこし理解できてきました。 インターフェースの例で補足説明をお願いしたいです。 interface IColorでstring Color{get; set;}を定義したあと、(Interfaceは実装は別途行う必要があるので)、IColorを継承したAModelで、改めてpublic string Color{get; set;}を実装しています。 それなら、interface IColorを使わず、IColorを継承もせず、単にAModelでpublic string Color{get; set;}を実装したほうがシンプルに感じます。 わざわざIColorを実装するメリットはなにでしょう? インターフェース初心者なので、いまいちピンときていないです。 補足していただけると幸いです。 あと、ということは、継承して減らすということはできないってことでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問