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

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

新規登録して質問してみよう
ただいま回答率
85.38%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

561閲覧

Processingでクラスのカプセル化を行う方法

Coloccini

総合スコア1

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

2グッド

0クリップ

投稿2023/09/05 03:15

編集2023/09/05 04:17

実現したいこと

Processingで、クラスのカプセル化を行いたいです。

前提

Processing でクラスのカプセル化を行う方法をご教授いただきたいです。

Processingでクラスを作成し、メンバ変数に private指定 を行いました。
そして、setup関数内で作成したクラスをインスタンス化し、メンバ変数にアクセスしました。

private指定しているメンバ変数にアクセスしようとしているため、
エラーが出る想定だったのですがエラーが出ず実行されたという状態です。

※エラーが出る想定の行:Main.pdeの6行目

私の記述が悪いのか、Processingではそもそもこのような手法ではカプセル化ができないのか、
公式リファレンスなどを参照しましたが理解ができませんでした。
お手数ですがご確認いただけますと幸いです。

該当のソースコード

Main.pde

1void setup() { 2 3 Test b = new Test(); 4 Student a = new Student(1, "sasaki"); 5 6 a.name = "sasaki"; 7 8 println(a.getStudentNo() + ":" + a.getName()); 9 10 // Processing実行ウィンドウを閉じる 11 exit(); 12}

Student.pde

1class Student { 2 3 // メンバ変数 4 private int studentNo; // 学生番号 5 private String name; // 名前 6 7 // コンストラクタ 8 Student(int studentNo, String name) { 9 this.studentNo = studentNo; 10 this.name = name; 11 } 12 13 // メソッド 14 int getStudentNo() { 15 return this.studentNo; 16 } 17 String getName() { 18 return this.name; 19 } 20 void setStudentNo(int studentNo) { 21 this.studentNo = studentNo; 22 } 23 void setName(String name) { 24 this.name = name; 25 } 26}

試したこと

1. Processingの公式リファレンス等を参照

・公式リファレンス:https://processing.org/reference/private.html

以下が公式リファレンスに記述してある内容です。

This keyword is used to disallow other classes access to the fields and methods within a class. The private keyword is used before a field or method that you want to be available only within the class. In Processing, all fields and methods are public unless otherwise specified by the private keyword.
This keyword is an essential part of Java programming and is not usually used with Processing. Consult a Java language reference or tutorial for more information.

この内容を見ると、privateキーワードを使用することで「クラスのメンバ変数について、他のクラスからアクセスできないようにする」ことができるように見受けられます。

2. privateキーワード以外を指定

以下のように、privateキーワード以外を使用してプログラムを実行してみました。
しかし、事象は変わりませんでした(エラーがなく実行される)。

Student.pde

1class Student { 2 3 // メンバ変数 4 protected int studentNo; // 学生番号 5 protected String name; // 名前 6 7 // コンストラクタ 8 Student(int studentNo, String name) { 9 this.studentNo = studentNo; 10 this.name = name; 11 } 12 13 // メソッド 14 int getStudentNo() { 15 return this.studentNo; 16 } 17 String getName() { 18 return this.name; 19 } 20 void setStudentNo(int studentNo) { 21 this.studentNo = studentNo; 22 } 23 void setName(String name) { 24 this.name = name; 25 } 26}

補足情報(FW/ツールのバージョンなど)

Processingのバージョンは Processing 4 です。

TN8001, uky👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

private指定しているメンバ変数にアクセスしようとしているため、
エラーが出る想定だったのですがエラーが出ず実行されたという状態です。

Processingでは.pdeに書いた内容はすべて、(PAppletを継承した)1つのクラスにまとめられます(これはProcessingの仕様です)

java

1class スケッチ名 extends PApplet { 2 // すべての .pde は、ココの中に書いていることになる 3}

.pde内のクラスは入れ子のクラスになり、privateメンバーでもアクセス可能です(これはJavaの仕様です)
Java におけるネストしたクラスについて

提示の内容であれば「Student.java」と名前を付けたタブを作り、その中にStudentクラスを書けば想定通りエラーになります。

そのかわりprintlnellipse等の組み込み関数が軒並み使えなくなり、グローバル変数も見えません。
正確に言うと組み込み関数はPAppletのメソッドであり、グローバル変数は(1つにまとめられたクラスの)フィールドです。

公式リファレンスなどを参照しましたが理解ができませんでした。

「Tabs, Multiple Files, and Classes」の「Advanced」あたりにちょろっと書いてあります。
Environment / Processing.org

ただProcessingの対象者にそのあたりの「高度な」話は、するつもりも必要もないと考えているような気はします。
private keyword is ignored · Issue #3757 · processing/processing
Look into modifying the reference for "private" · Issue #304 · processing/processing-docs


個人的にはJavaの入れ子クラスの仕様は癖が強いなとは感じます(C#なんかでは入れ子にはできますが、親のメンバーが見えたりはしません)

そのおかげで(裏でクラスに包むだけで)カジュアルな書き心地が実現できたわけですが、デメリットも少しありますね^^;

投稿2023/09/05 05:32

TN8001

総合スコア9727

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

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

TN8001

2023/09/05 05:32

わたしもProcessing初めたてのころ「privateになってないやん!」ってなりました^^;
Coloccini

2023/09/05 06:01

ご丁寧にありがとうございます。 「.pde」ファイルに記述した内容は Processing内部で 1つのクラスにまとめられるのですね。 内部の仕組みを含めて教えて頂いたので納得することができました。 また、クラスのカプセル化の挙動を確認するための方法(「.java」ファイルを作成して使用する)も併せてご教授いただきありがとうございます。 早速、試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.38%

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

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

質問する

関連した質問