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

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

新規登録して質問してみよう
ただいま回答率
85.47%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

5回答

1015閲覧

TypeScriptで、特定のクラスからのみアクセス可能なメソッドの作成はできますでしょうか

退会済みユーザー

退会済みユーザー

総合スコア0

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

2クリップ

投稿2020/01/09 02:58

下記「★質問ポイント★」の場所です。

typescript

1class Manager { 2 mem1: Member; // メンバへのアクセスは可能 3 mem2: Member; 4 mem3: Member; 5 constructor() { 6 this.mem1 = new Member("yama"); 7 this.mem2 = new Member("naga"); 8 this.mem1 = new Member("koku"); 9 } 10 allSing() { 11 mem1.sing(); 12 mem2.sing(); 13 mem3.sing(); 14 } 15} 16 17class Member { 18 name: string; 19 constructor(n: string) { 20 this.name = n; 21 } 22 /** みんな呼べる */ 23 greet() { 24 alert(`はい${this.name}`); 25 } 26 /** 27 ★質問ポイント★Managerからのみ呼び出されるようにしたい。Otherからは呼び出されたくない。 28 publicではみんな呼べてしまう 29 privateでは誰も呼べない 30 protectedでもManagerから呼べない 31 なんかうまい方法ない? 32 */ 33 sing() { 34 alert(`${this.name}`); 35 } 36} 37 38class Other { 39 hey() { 40 mngr = new Manager(); 41 mngr.allSing(); // できてほしい 42 mngr.mem1.greet(); // できてほしい 43 mngr.mem1.sing(); // ★ビルドエラーになってほしい 44 } 45}

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

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

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

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

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

guest

回答5

0

ちょっとがっさいですが、引数から、特定のクラスのインスタンスかどうかを取得し、
特定のクラスでなければ、処理をしない、とか・・・。

typescript

1class Manager { 2 mem1: Member; // メンバへのアクセスは可能 3 mem2: Member; 4 mem3: Member; 5 constructor() { 6 this.mem1 = new Member("yama"); 7 this.mem2 = new Member("naga"); 8 this.mem1 = new Member("koku"); 9 } 10 allSing() { 11 mem1.sing(this); 12 mem2.sing(this); 13 mem3.sing(this); 14 } 15} 16 17class Member { 18 name: string; 19 constructor(n: string) { 20 this.name = n; 21 } 22 /** みんな呼べる */ 23 public greet() { 24 alert(`はい${this.name}`); 25 } 26 /** 27 ★質問ポイント★Managerからのみ呼び出されるようにしたい。Otherからは呼び出されたくない。 28 */ 29 public sing(instance: any): Error | boolean { 30 if (instance.constructer.name === 'Manager') { 31 alert(`${this.name}`); 32 return true; 33 } else { 34 throw new Error('Method call error, Cannot be called from that class.'); 35 } 36 } 37} 38 39class Other { 40 hey() { 41 mngr = new Manager(); 42 mngr.allSing(); // できてほしい 43 mngr.mem1.greet(); // できてほしい 44 mngr.mem1.sing(this); // ★ビルドエラーになってほしい 45 } 46}

大変申し訳ございませんが、動作検証はしておりません。
クラス名の取得と、エラーを返す部分はもしかしたら、構文が間違っているかもです。
なので、その場合は、考え方のみご参考いただければと思います。
(しかもビルドでエラーはでないかも)

投稿2020/01/20 07:08

miyabi_takatsuk

総合スコア9528

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

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

0

直接メソッドにするのではなく、singを別ファイルに関数として用意して、使う場所でだけimportすることで、無関係な箇所では使わせない、という方法はどうでしょうか。

投稿2020/01/09 05:40

maisumakun

総合スコア145201

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

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

0

投稿2020/01/09 05:02

quickquip

総合スコア11055

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

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

0

下記のように、MemberをPrivateにして、各Menberのgreetだけ個別に呼べるよう、Managerにpublic関数を定義したらどうてしょうか?

「特定のクラスからのみアクセス可能なメソッドの作成」とはちょっと違うので質問の意図と違う回答だったらすみません。

class Manager { private mem1: Member; // メンバへのアクセスは可能 private mem2: Member; private mem3: Member; constructor() { this.mem1 = new Member("yama"); this.mem2 = new Member("naga"); this.mem1 = new Member("koku"); } allSing() { mem1.sing(); mem2.sing(); mem3.sing(); } mem1Greet() {this.mem1.greet()} mem2Greet() {this.mem2.greet()} mem3Greet() {this.mem3.greet()} } class Member { name: string; constructor(n: string) { this.name = n; } /** みんな呼べる */ greet() { alert(`はい${this.name}`); } /** ★質問ポイント★Managerからのみ呼び出されるようにしたい。Otherからは呼び出されたくない。 publicではみんな呼べてしまう privateでは誰も呼べない protectedでもManagerから呼べない なんかうまい方法ない? */ sing() { alert(`♪${this.name}`); } } class Other { hey() { mngr = new Manager(); mngr.allSing(); // できてほしい mngr.mem1Greet(); // 変更 mngr.mem1.sing(); // ビルドエラー } }

投稿2020/01/09 04:18

gauss0322

総合スコア9

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

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

退会済みユーザー

退会済みユーザー

2020/01/09 04:50

ありがとうございます。やはりManagerが全て面倒見るスタイルになってしまいますかね。。
gauss0322

2020/01/09 05:45

「Manager」なので、OtherはManager経由でアクセスするでいいかなーと思います。 Member側で「Managerクラスからのアクセスのみ許可する」みたいなコードを無理矢理書くと、今度はMenberがManagerに依存することになりますので、そちらの方が不自然かと思いました。
guest

0

Member クラスに sign() 関数を実装しなければいいのではないでしょうか。
Manager クラスの allSign() ですべてやるようにすればいいと思います。

TypeScript

1allSing() { 2 alert(`${this.mem1.name}`); 3 alert(`${this.mem2.name}`); 4 alert(`${this.mem3.name}`); 5}

投稿2020/01/09 04:17

nerianighthawk

総合スコア544

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

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

退会済みユーザー

退会済みユーザー

2020/01/09 04:53

ありがとうございます。Memberの挙動はMemberの関心事としたいので(ManagerはMemberが”どう歌うか”は興味ない)、singはMemberに置きたいんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問