ここから本文です

C#やJavaの抽象クラスにおけるコンストラクタのpublicとprotectedの違いは? ど...

yoh********さん

2010/6/2317:55:08

C#やJavaの抽象クラスにおけるコンストラクタのpublicとprotectedの違いは?

どちらにせよ派生クラスからしか呼び出せないわけですが、使い分ける意味はあるのでしょうか。

補足すみません、繰り返しになりますが、抽象クラスの“コンストラクタの”“publicとprotectedの違い”です。どちらも結局、派生クラスのコンストラクタからしか呼べないように思うのです。

恐らくttkai00さんの「Javaなら匿名クラスがあるから違いがある」が正解のような気がしますが、「じゃあC#は実質的に違いなし?」という点も気になりますので、もうしばらく回答を受けたいと思います。

閲覧数:
1,739
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

ttkai00さん

編集あり2010/6/2409:16:04

C# の場合、違いはないと思いますが、Java の場合は抽象クラスのコンストラクタを使って、匿名クラスを作ることができますから、その部分で差異があると思います。

派生クラスからしか呼ばないつもりなら、protected の方がそれが明示的になりますので、私は protected を使っています。

※追記

メソッドのことだと思って回答している方がいるようですが、質問はコンストラクタですよね?メソッドなら、C# の場合でも明確な違いがあります。

質問した人からのコメント

2010/6/29 17:20:56

成功 どうも他に出て来ないようなので締めます。ベストアンサーは、最初にきちんと題意を把握していただいた方へ。それにしても、C#はリフレクションレベルでしか違いがないんでしょうかね…。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

ISLeさん

編集あり2010/6/2418:30:15

> どちらにせよ派生クラスからしか呼び出せないわけですが

???派生クラスからしか?

Javaの場合、
<Foo.java>
package foo;
public abstract class Foo {
public abstract void public_method();
protected abstract void protected_method();
}
<Bar.java>
package bar; // 抽象クラスとは異なるパッケージ
public class Bar extends foo.Foo { // 抽象クラスを継承
public void public_method() {}
public void protected_method() {} // Javaではアクセス範囲の拡大可能
}
<Test.java>
package hoge; // 抽象クラス・派生クラスとも異なるパッケージ
public class Test { // 抽象クラスを継承しない
public static void main(String[] args) {
foo.Foo foo = new bar.Bar(); // 抽象クラスの型で参照
foo.public_method(); // 継承関係の外からでもpublicは確実に呼べる
foo.protected_method(); // 継承関係外なのでprotectedは呼べない。隠蔽されている。※コンパイルエラー※
bar.Bar bar = new bar.Bar(); // 派生クラスの型で参照
bar.public_method(); // 継承関係の外からでもpublicは確実に呼べる
bar.protected_method(); // publicに拡大したので確実に呼べる
}
}

C#はアクセス指定子の変更不可なので継承関係の外からはpublicだけが確実に呼べるとなります。


[補足]
すみません。質問を読み違えてました。
確かにコンストラクタでは実質的な違いはないですね。

思い付くのはこんなところですかね。
<Test.java>
import java.lang.reflect.InvocationTargetException;
abstract class Foo {
public Foo(int i0) {}
protected Foo(int i0, int i1) {}
}
class Bar extends Foo {
public Bar(int i0, int i1) { super(i0, i1); }
}
public class Test {
public static void main(String[] args) {
try {
Class<? extends Foo> c = Class.forName("Bar").asSubclass(Foo.class);
Foo foo = c.getConstructor(int.class).newInstance(10);
} catch (ClassNotFoundException e) {
} catch (IllegalArgumentException e) {
} catch (SecurityException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) { // ←これが発生
// publicコンストラクタを派生クラスでも実装して欲しいのだけど…意思表示にしかならないか
}
}
}

プラグイン仕様を一般公開するときとか。
未知の派生クラスのコンストラクタの実装は分からないですから。

jtaka451さん

2010/6/2319:18:26

こういうことかな。
http://www.kab-studio.biz/Programing/Codian/Cpp/06.html

# publicとprotectedの違いは?
# ではなく
# privateとprotectedの違いは?
# と見ましたが。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる