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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

6894閲覧

interfaceに対してプログラミングをする[java]

hanayamaKaoru

総合スコア36

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/12/19 14:20

編集2016/12/19 16:49

###前提・実現したいこと
少し確認したいことがあるので簡単に質問します

interfaceにはgetterやsetterは基本的にはすべきではない(
まだ存在しないフィールドのためのメソッドを用意することになる)ので
getterやsetterが必要になるようなクラスに対しては
「interfaceに対してプログラミングをする」ことはできないと思うのですが

ならば、getterやsetterが必要になるようなクラスに対しては
interfaceをimplementsした抽象クラスにsetterとgetterを追加して
「抽象クラスに対してプログラミングをする」を行えば良いのでしょうか

ご意見をお願いします

###「interfaceに対してプログラミングをする」ことはできないcode
*コンクラスタなどは省く
*Ownerもinterfaceを継承して実装を書くべきだとは思うが省く

interfaceに対してプログラミングをするならば
Ownerクラスにおいて
private Animal dog; とすべきだが
その場合dog.getName()などとはできない
そのため

getterやsetterが必要になるようなクラスに対しては

interfaceをimplementsした抽象クラスにsetterとgetterを追加して
「抽象クラスに対してプログラミングをする」を行えば良いのでしょうか

と質問した次第です

*クラスのフィールドにMap型を採用して全てそこにpropertiesを入れるのであれば
interfaceにgetProperties()やgetProperty(String key)を定義することも可能だと思いますが

java

1public interface Animal{ 2 public void eat(); 3} 4 5 6public class Dog implements Animal{ 7 private String name; 8 9 10 @Override 11 public void eat(){ 12 System.out.println("ガブガブ"); 13 } 14 public String getName(){ 15 return name; 16 } 17 public void setName(String name){ 18 this.name = name; 19 } 20 21} 22 23 24public class Owner{ 25 private Dog dog; 26 /**/ 27 /*略*/ 28}

追記


interfaceの利用方法・手順ではなく作法としてどうなのかということについてお聞きしたいです

「interfaceに対してプログラミングをする」とは
あるinterfaceを継承したクラスAを利用するクラスBは
classAではなくそのinterfaceに対してプログラミングをするという意味です
逆に「実装に対してプログラミングしてはならない」なども書籍で数回目にしたのでテクニカルタームとしては一般的なのかと認識していました

interfaceに対してプログラミングをする

A-pZ👍を押しています

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

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

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

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

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

swordone

2016/12/19 16:32

正直「クラスやインタフェースに『対して』プログラミングする」という言葉の意味を掴みかねるのですが…どういうことなのでしょうか?
guest

回答2

0

ベストアンサー

getterとsetterに対する考え方が間違っています。

getterとsetterはprivateなフィールドを公開したいから設定するのではありません。発想が逆です。そのようなgetterとsetterが必要になるから、その実装としてprivateのフィールドを使っているに過ぎません。始めにフィールドありきで考えないでください。まずはメソッドから考えてください。

例のAnimalとDogで考えましょう。Animalからは何かしらの名前(name)を取得できて、また、変更もできる物だとするのであれば、AnimalインターフェースにgetName()setName()を付け加えることは(メソッド名の善し悪しは別としても)なんらおかしいことではありません。その実装をDogにするにあたり、nameというフィールドに対する取得や変更とするのか、全く別にするのかは自由です。フィールド名はname以外でも良いですし、メソッド内で変換するなら型がStringではなくchar[]でも良いのです。それこそ、どんな名前を付けても一つの名前にこだわるような作りでもかまいません。

また、Animalは名前があるかわからないというのであれば、

Java

1interface Namable { 2 public abstract String getName(); 3 public abstract void setName(String name); 4} 5interface AnimalWithName extends Animal, Namable { 6}

のようなインターフェースを新たに作ってDogに入れても良いのです。

何はともあれ、getterとsetterの形になるメソッドについてはフィールドから分離して不必要を考えることをお勧めします。

投稿2016/12/19 22:30

raccy

総合スコア21735

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

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

0

interfaceにはgetterやsetterは基本的には定義できない(すべきではない)ので

「interfaceに対してプログラミングをする」ことはできないと思うのですが

interfaceに対して実装はできませんが、宣言はできます。
例えば、インタフェース Collectionには反復子を取得するiterator()という(抽象)メソッドが宣言されています。
宣言することを「プログラミングをする」ことに含めるなら、できることになります。
お気づきのように、(抽象)メソッドはその実体を持たないので、そのinterfaceをimplementsした(抽象または具象)クラスがメソッドを(追加して)オーバーライドして実体を定義することになります。ただし、抽象クラスの場合、interfaceの(抽象)メソッドを抽象メソッドのままにしておくこともできます。
抽象クラスは抽象メソッドを1つ以上持ったクラスですが、具象メソッドを持つこともできます。
いずれにせよ、interfaceで宣言したメソッド(自動的に抽象メソッドになります)はクラスでオーバーライドして実体を定義することになります。

投稿2016/12/19 15:15

naomi3

総合スコア1105

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

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

退会済みユーザー

退会済みユーザー

2016/12/19 22:48

いまの最新は default実装で実装できると言えばできるけどね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問