【C#】何度も同じクラスを複数の場所から使いたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
なしめ

【C#】何度も同じクラスを複数の場所から使いたい

#1

投稿記事 by なしめ » 12年前

コード:

はじめまして。この度不明な点が有り質問させて頂きます、なしめと申します。

現在私はC#という言語でソフトウェアを作りたいと思って勉強しているのですが(と言っても具体的なコードも何も掛けてません^^;)、そこで不明な点が有り質問させて頂きました。
不明な点というのは、C#にて「複数の場所で同じクラスを何度も使用する」ということです。
C++では 「class MainClass : public SubC1, public SubC2」 という風に多重継承により同じクラスが複数の場所から簡単に読み込むことが出来たのですが、
C#だとこれが2個まで (class MainClass : public Sub1) しかできなくて困っています。
Partialは出来れば使いたくないという変な拘りがあって、余計に解決しません(;_:)

以下に少し省略しますがコードを載せさせて頂きますと、

コード:

public class cEngine
{
        --省略--
        private void FileCreate(string file_name)
        {
            using (FileStream fStream = File.Create(file_name))
            {
                byte[] bs = Encoding.UTF8.GetBytes("file" + "@@@" + file_name + "@@@");
                fStream.Write(bs, 0, bs.Length);
                if (fStream != null) { fStream.Close(); }
            }
        }
}
public partial class _initfirstForm : Form
{
        cEngine ce = new cEngine();
        --省略--
}
public partial class MainFormWindow : Form
{
        cEngine ce = new cEngine();
        --省略--
}
...以上のコードの様に各自でクラスを宣言しているのですが、これだとドンドン新しいcEngineを作ってしまっている気がして効率が悪いのかなーと思ったり、
例にとって「MainFormWindowフォームクラス内で定義した文字列や関数が、_initfirstFormで見てみるとnullだったり...」という状況になってしまいます。

分かりにくくなってしまったので、まとめとして私が知りたいことは「C#でもC++の様な多重継承が出来るのか」と「できない場合はどうしたら良いでしょう( ;A;)」ということです。
長々と申し訳ありません。宜しくお願いしますm(_ _)m

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#2

投稿記事 by beatle » 12年前

僕の理解力が低いのかもしれませんが,質問文を読んで混乱しました.
「複数の場所で同じクラスを何度も使用する」というのを,もっと具体的に書いていただけると,この混乱が解けるのではないかと思います.
複数の「場所」とは具体的にどこか.
何度も「使用する」というのは具体的に何をすることか.

僕が「複数の場所で同じクラスを何度も使用する」を読んで一番に思いついた解釈は,
「複数のメソッド内,またはフィールド宣言で同じクラスを何度もインスタンス化する」というものでした.しかし,これは普通にできることです.現になしめさんも_initfirstFormとMainFormWindow内のフィールド宣言において,cEngineクラスをインスタンス化しています.
とすると,「何度も使用する」って何だろうということです.これが未だに分かりません.

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#3

投稿記事 by beatle » 12年前

とりあえず,僕が混乱した部分を無視して
「C#でもC++の様な多重継承が出来るのか」と「できない場合はどうしたら良いでしょう( ;A;)」
という質問だけを読んだつもりで答えるとすれば,
「C#(やJava)ではC++の様な多重継承はできません.代わりにインターフェースというクラスに似た物を使います.」
となります.
でもこれは,僕の想像ですが,なしめさんの本当の疑問には答えられていないと思いますので,僕の1つ前の質問に答えていただけたらと思います.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#4

投稿記事 by softya(ソフト屋) » 12年前

無闇に多重継承を使う必要があるかどうか自体疑問なのですが、「複数の場所で同じクラスを何度も使用する」と言う事と多重継承の関連性を説明していただけますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
lriki
記事: 88
登録日時: 13年前

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#5

投稿記事 by lriki » 12年前

多重継承は容易にトラブルを引き起こす可能性があるという点から
C#では多重継承を禁止しています。
それにひっかかる設計はC#的には正しくない設計ですので、
別の方法を考えた方がいいと思います。

なしめ さんが書きました:「MainFormWindowフォームクラス内で定義した文字列や関数が、_initfirstFormで見てみるとnullだったり...」
このあたりのくだりから、シングルトンみたいなものを作りたいではと予想してみてます。
それとはちがうものなのでしょうか。


それと、質問する時に「これはできますか?」と聞くよりも
「こういうソフトを作るためにこういった機能が必要なのですが、できますか?」
と聞く方が、いろいろとアドバイスを受けやすいと思います。

なしめ

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#6

投稿記事 by なしめ » 12年前

ご返信有難うございます。なしめです。説明下手ですみません(;_:)
皆さんの返信を読んで私がやりたい事を改めて具体的に整理してみました。
まず一つ目が

コード:

    class Property
    {
        public int KidouFlag;
        public string Name;
    }
というクラスがあったとして、これを一つのクラス(例えばMainForm.cs)から「Property pt = new Property();」という風にした後数値や文字を定義した場合、
これをMainForm.cs以外のクラス(例えばSubForm.cs)でも同じように使用した場合、数値や文字を引き継ぐ(?)事は出来るのでしょうか?
フォームクラスなので既に継承の部分には「MainForm:Form」という風に書いてあり、これ以上継承が出来ない(MainForm:Form:Propertyの様に複数継承をしたい)のです。

....なんというか、特定のクラスを他のクラスから定義しなくても、関数とか文字列って使えたりするのでしょうか、ということです。
(「Class1:Property」という風にしたら、Propertyを新しく定義しなくてもProperty内のstringやintが扱える、というものが複数できないか?ということです)
後複数継承があまり良くないということなのですが、インターフェイスというものを各サイトをまわって調べてみたのですが、私の思っている事(↑のカッコ内)と違っていた(というより理解できていない)ので、少し簡単な説明を頂けたらと.....

他人任せな質問で申し訳ありません。引き続き宜しくお願いします。

なしめ

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#7

投稿記事 by なしめ » 12年前

度々ごめんなさい!なしめです。
今書いたのを読みなおして訳がわからない事になっていたので少し訂正させて頂きますと
....なんというか、特定のクラスを他のクラスから定義しなくても、関数とか文字列って使えたりするのでしょうか、ということです。
(「Class1:Property」という風にしたら、Propertyを新しく定義しなくてもProperty内のstringやintが扱える、というものが複数できないか?ということです)
という部分を具体的に描くと、Propertyクラス(数値とか文字列とか定義してある物)を、MainFormクラス(フォームクラス)から「Property pt = new Property();」をしてその後中身の値を宣言した後、この値を保持したままSubForm1クラスでも使えるのかということです。
ただ、SubForm1クラスでも「Property pt = new Property();」という風にしなければならないので、これだとドンドン新しいものを作成してしまっている&新しく定義しちゃっているので中身がリセットされてしまう、というのが今回の不明な点です。
そして複数継承というものが出来ないかという質問に至りましたm(_ _)m
要するにクラス間で値を共有したいのです。
C#に搭載されてるSettingというのを使えばプロジェクトファイル内で値が保存・共有出来るものが有りますが、出来ればアレは使わず普通のクラス間でやりとりがしたいです。
度々申し訳ありません。宜しくお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#8

投稿記事 by softya(ソフト屋) » 12年前

継承したからといってインスタンスが別では値は引き継がれません。これはC#でもC++でも同じですので、多重継承によってグローバル変数化を目論む事自体が間違いだと思います。
それと変数をただ見せている状態なので、これはクラスではなく構造体です。それもグローバル宣言された構造体変数を使いたいと言っているのと同義です。
なのでstatic宣言すればグローバルにはなりますが、あまりオススメはしません。

ちゃんとカプセル化する事と出来ればシングルトンパターンなどを使って下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

なしめ

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#9

投稿記事 by なしめ » 12年前

softya(ソフト屋)さん返信有難うございます。
なるほど。。。何か私は根本的に間違えていました。
すっかりカラの変数でも、一度別のクラス(というより構造体?)から定義したらそのまま値は引き継がれていくものだと思っていました。
シングルトンパターンという物を初めて聞きました。調べて頑張ってみます!

後もう一度1から講座等みてオブジェクト指向について学び直してみます^^;
皆様この度はご返答有難うございました!

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#10

投稿記事 by beatle » 12年前

なしめさんが言っていることが理解出来ない僕ですが,とりあえずこんなことは出来ますよというサンプルを書いてみました.

コード:

class Prop
{
    public string foo = "foo foo";
}

class A
{
    public Prop prop = new Prop();
}

class B
{
    private Prop prop;
    public B(A a)
    {
        prop = a.prop;
    }
}

なしめ

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#11

投稿記事 by なしめ » 12年前

beatleさん、ご返信有難うございます。
実はその方法で最初はやっていたのですが、どうも値がバラバラなのでブレークポイントを入れて確認していたら、宣言したはずの文字列がnullになっていたり、最後にはProp自体が引用したはずなのにnullになっていたりと、、、
単に私が管理しきれてないだけなのかも知れませんが^^;
有難うございます。もう一度見なおして参考にさせて頂きます。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#12

投稿記事 by beatle » 12年前

余計なお世話かもしれませんが,もう少し用語を正確に使われた方が良いと思います.
例えば「宣言したはずの文字列」とか「Prop自体が引用した」とか.
変数の「宣言」というのは

コード:

string foo; // 変数fooの宣言(定義ともいう)
のように変数を作ることです.「宣言したはずの文字列がnullになっていた」というのは至極当然なんです.初期値を指定しなければnullになりますから.
「引用」に至っては意味がわかりません.普通そんな言葉は使いません.

もう一度見直すと仰っているのでただのお節介になってしまっているかもしれませんが,言わんとしていることを伝えるには用語を使いこなす必要があるということを伝えたかったのです.
用語が不安なら,その用語を説明する簡単なサンプルソースを付ければ伝わりやすくなります.お試し下さい.

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 【C#】何度も同じクラスを複数の場所から使いたい

#13

投稿記事 by beatle » 12年前

説明が伝わりにくいなと思ったら,チャットに来ていただくのもいいかもしれません.
チャットだと,分かりにくい記述があれば即座にツッコミを入れることが可能ですので,掲示板で交互に書きこむより自分の考えを伝えやすいです.

(今からいかがでしょうか)

閉鎖

“C言語何でも質問掲示板” へ戻る