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

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

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

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

Q&A

解決済

3回答

11124閲覧

c#で内部クラスから外部クラスにアクセスする方法

yrema

総合スコア286

C#

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

0グッド

0クリップ

投稿2019/05/17 08:55

編集2019/05/17 09:27

タイトルの通りですが、
下記のようにClass2からClass1.aにアクセスしたいのですが、
★の部分をどう書けばよろしいのでしょうか?

c#

1 class Class1 2 { 3 public int a; 4 5 class Class2 6 { 7 void func1() 8 { 9 Class1.this.a // ★ Javaだとこんなイメージ(当然コンパイルエラー) 10 } 11 } 12 }

java

1public class MainActivity extends XXXX 2 (中略) 3 public View.OnClickListener createOnClickListenerForWeb(final String url) { 4 return new View.OnClickListener() { 5 @Override 6 public void onClick(View v) { 7 CommonUtils.showPushedEffect(v, MainActivity.this); // ★このMainActivity.thisのような感じ 8 } 9 }; 10 }

参考
Javaの内部クラスから外部クラスへのアクセス
https://qiita.com/liguofeng29/items/6cafca5bf92e0381ee42
ここの「Outer.this.outerVal」とアクセスしているイメージのことをC#でもやりたいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

もしClass2 is-a Class1が成り立つ関係ならば継承を考えます。
そうではなくClass1 has-a Class2ならば
Class2作成の際かfunc1呼び出しの際にClass1のインスタンスを渡します。

投稿2019/05/17 09:09

asm

総合スコア15147

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

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

yrema

2019/05/17 09:22

すみません、thisの書く場所が逆でした。今Javaのコードを書きました。このMainActivity.thisのような書き方をしたかったのです。
guest

0

a はインスタンスメンバーなのでインスタンスが無いとアクセスできません。
Class2 を作成するときに Class1 のインスタンスを渡してそれを保持するようにしてください。

#追記

C# ではメソッドの中でクラスを拡張することができないので、次のようになります。
実行してみるとわかりますが、this はあくまで MainActivity を差します。

C#

1using System; 2 3namespace ConsoleApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var mainActivity = new MainActivity() 10 { 11 A = 200 12 }; 13 mainActivity.CreateOnClickListenerForWeb("URL").OnClick(100); 14 Console.ReadKey(); 15 } 16 } 17 18 public class MainActivity 19 { 20 public int A { get; set; } 21 public OnClickListener CreateOnClickListenerForWeb(string url) 22 { 23 return new OnClickListener() 24 { 25 OnClick = v => 26 { 27 Console.WriteLine($"thisClass: {this.GetType().Name}, v: {v}, A: {A}"); 28 } 29 }; 30 } 31 32 public class OnClickListener 33 { 34 public Action<int> OnClick { get; set; } 35 } 36 } 37}

追記

また、元の書き方に従えばこのようになります。

C#

1using System; 2 3namespace ConsoleApp1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 var class1 = new Class1() 10 { 11 A = 100 12 }; 13 var class2 = new Class1.Class2(class1); 14 class2.Func1(); 15 Console.ReadKey(); 16 } 17 } 18 19 public class Class1 20 { 21 public int A { get; set; } 22 23 public class Class2 24 { 25 public Class2(Class1 owner) 26 { 27 Owner = owner; 28 } 29 30 public Class1 Owner { get; } 31 32 public void Func1() 33 { 34 Console.WriteLine(Owner.A); 35 } 36 } 37 } 38}

投稿2019/05/17 08:57

編集2019/05/17 09:41
Zuishin

総合スコア28660

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

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

yrema

2019/05/17 09:06 編集

Javaのようには書けないということでしょうか?(一字一句同じということではなくて)
Zuishin

2019/05/17 09:07

Java でも書けないんじゃないですか?
Zuishin

2019/05/17 09:12

外側から全部 Java で書くとしたらどういうコードになるか、それを追記してください。
yrema

2019/05/17 09:17 編集

すみません、thisの書く場所が逆でした。今Javaのコードを書きました。
yrema

2019/05/17 09:18

このMainActivity.thisのような書き方をしたかったのです。
guest

0

「Class1.a」がクラス変数なのか、インスタンス変数なのかによってやり方が違いますが、以下のように書くことができます。

クラス変数の場合:

C#

1class Class1 2{ 3 static public int a; 4 5 class Class2 6 { 7 void func1() 8 { 9 int b = Class1.a; 10 } 11 } 12}

インスタンス変数の場合:

C#

1class Class1 2{ 3 public int a; 4 5 class Class2 6 { 7 void func1() 8 { 9 var class1 = new Class1(); 10 int b = class1.a; 11 } 12 } 13}

投稿2019/05/17 09:09

nskydiving

総合スコア6500

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

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

yrema

2019/05/17 09:22

すみません、thisの書く場所が逆でした。今Javaのコードを書きました。このMainActivity.thisのような書き方をしたかったのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問