// Shape クラス(抽象クラス)
abstract class Shape {
// é¢ç©ã‚’計算ã—ã¦è¿”ã™æŠ½è±¡ãƒ¡ã‚½ãƒƒãƒ‰
abstract double getArea();
// 周囲ã®é•·ã•を計算ã—ã¦è¿”ã™æŠ½è±¡ãƒ¡ã‚½ãƒƒãƒ‰
abstract double getPerimeter();
}
// Circle クラス(円)
class Circle extends Shape {
// メンãƒãƒ¼å¤‰æ•°ï¼šåŠå¾„
private double radius;
// コンストラクタ
public Circle(double radius) {
this.radius = radius;
}
// é¢ç©ã‚’計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰
@Override
double getArea() {
return Math.PI * radius * radius;
}
// 周囲ã®é•·ã•を計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰
@Override
double getPerimeter() {
return 2 * Math.PI * radius;
}
}
// Rectangle クラス(長方形)
class Rectangle extends Shape {
// メンãƒãƒ¼å¤‰æ•°ï¼šå¹…ã€é«˜ã•
private double width;
private double height;
// コンストラクタ
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
// é¢ç©ã‚’計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰
@Override
double getArea() {
return width * height;
}
// 周囲ã®é•·ã•を計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰
@Override
double getPerimeter() {
return 2 * (width + height);
}
}
// Triangle クラス(三角形)
class Triangle extends Shape {
// メンãƒãƒ¼å¤‰æ•°ï¼šè¾ºã®é•·ã•(3辺)
private double side1;
private double side2;
private double side3;
// コンストラクタ
public Triangle(double side1, double side2, double side3) {
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
// é¢ç©ã‚’計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰ï¼ˆâ€»å®Ÿéš›ã®ä¸‰è§’å½¢ã®é¢ç©è¨ˆç®—ã¯çœç•¥ï¼‰
@Override
double getArea() {
// é¢ç©ã‚’計算ã™ã‚‹å…·ä½“çš„ãªå‡¦ç†ã‚’実装
// ã“ã“ã§ã¯å˜ç´”ã« 0 ã‚’è¿”ã—ã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã«ã¯ä¸‰è§’å½¢ã®é¢ç©è¨ˆç®—を実装ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
return 0;
}
// 周囲ã®é•·ã•を計算ã—ã¦è¿”ã™ãƒ¡ã‚½ãƒƒãƒ‰
@Override
double getPerimeter() {
return side1 + side2 + side3;
}
}
ã“ã®è§£ç”例ã§ã¯ã€Shape ã‚¯ãƒ©ã‚¹ãŒæŠ½è±¡ãƒ¡ã‚½ãƒƒãƒ‰ getArea() 㨠getPerimeter() を定義ã—ã€Circleã€Rectangleã€Triangle クラスãŒãれãžã‚Œã“れらã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¦ã„ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ç•°ãªã‚‹å½¢çжã®ã‚ªãƒ–ジェクトãŒå…±é€šã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースをæä¾›ã™ã‚‹ã‚¯ãƒ©ã‚¹éšŽå±¤ãŒæ§‹ç¯‰ã•れã¦ã„ã¾ã™ã€‚ãªãŠã€Triangle クラス㮠getArea() メソッドã¯å®Ÿéš›ã®ä¸‰è§’å½¢ã®é¢ç©è¨ˆç®—を行ã†ã‚ˆã†ã«å®Ÿè£…ã•れるã¹ãã§ã™ãŒã€ã“ã“ã§ã¯å˜ç´”ãªä¾‹ã¨ã—㦠0 ã‚’è¿”ã—ã¦ã„ã¾ã™ã€‚
ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨æŠ½è±¡ã‚¯ãƒ©ã‚¹ã®åˆ©ç”¨
ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨æŠ½è±¡ã‚¯ãƒ©ã‚¹ã®å½¹å‰²
抽象クラス:
役割:
å…±é€šã®æŒ¯ã‚‹èˆžã„ã‚„æ§‹é€ ã‚’æŒã¤ã‚¯ãƒ©ã‚¹ã‚’定義ã™ã‚‹ãŸã‚ã®åŸºç›¤ã¨ãªã‚Šã¾ã™ã€‚
抽象メソッドや具象メソッドをå«ã‚€ã“ã¨ãŒã§ãã€ä¸€éƒ¨ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’サブクラスã§å®Ÿè£…ã™ã‚‹ã“ã¨ãŒæ±‚ã‚られるã“ã¨ãŒã‚りã¾ã™ã€‚
利点:
共通ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚„メンãƒãƒ¼å¤‰æ•°ã‚’æä¾›ã§ãã€ã‚µãƒ–クラスãŒã“れらを継承ã—ã¦åˆ©ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
具象メソッドをå«ã‚ã‚‹ã“ã¨ãŒã§ãã€ã‚µãƒ–クラスãŒå…±é€šã®æŒ¯ã‚‹èˆžã„ã‚’å†åˆ©ç”¨ã™ã‚‹éš›ã«ä¾¿åˆ©ã§ã™ã€‚
abstract class AbstractShape {
abstract double getArea();
abstract double getPerimeter();
}
インターフェイス:
役割:
実装ã•れã¦ã„るクラスãŒç‰¹å®šã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’æä¾›ã™ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã®å¥‘約を定義ã—ã¾ã™ã€‚
複数ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを実装ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
利点:
クラスãŒè¤‡æ•°ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを実装ã™ã‚‹ã“ã¨ã§ã€ç•°ãªã‚‹ã‚³ãƒ³ã‚»ãƒ—トを組ã¿åˆã‚ã›ãŸæŸ”軟ãªè¨è¨ˆãŒå¯èƒ½ã§ã™ã€‚
インターフェイスを実装ã™ã‚‹ã‚¯ãƒ©ã‚¹ã¯ã€ãã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスãŒè¦æ±‚ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’æä¾›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
interface Shape {
double getArea();
double getPerimeter();
}
ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨æŠ½è±¡ã‚¯ãƒ©ã‚¹ã®é¸æŠžåŸºæº–
抽象クラスをé¸ã¶å ´åˆ:
共通ã®ã‚³ãƒ¼ãƒ‰ã‚„データをæä¾›ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã€‚
サブクラスã«ã‚ˆã‚‹æ‹¡å¼µãŒå¿…è¦ã§ã‚りã€ä¸€éƒ¨ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’æ—¢ã«å…·è±¡åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å ´åˆã€‚
abstract class AbstractShape {
double getArea() {
// 共通ã®å®Ÿè£…
return 0;
}
}
インターフェイスをé¸ã¶å ´åˆ:
複数ã®ã‚¯ãƒ©ã‚¹ã«ã‚ˆã£ã¦å…±æœ‰ã•れる振る舞ã„を指定ã™ã‚‹å ´åˆã€‚
æ—¢ã«ä»–ã®ã‚¯ãƒ©ã‚¹ã‚’æ‹¡å¼µã—ã¦ã„ã‚‹å ´åˆã‚„ã€è¤‡æ•°ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを実装ã™ã‚‹æŸ”軟性ãŒå¿…è¦ãªå ´åˆã€‚
interface Shape {
double getArea();
}
共通ã®åˆ©ç”¨ã‚·ãƒŠãƒªã‚ª
複数ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを実装:
クラスãŒè¤‡æ•°ã®ç•°ãªã‚‹å½¹å‰²ã‚’æžœãŸã™å¿…è¦ãŒã‚ã‚‹å ´åˆã€è¤‡æ•°ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを実装ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
class Circle implements Shape, Drawable {
// ...
}
抽象クラスを基底クラスã¨ã—ã¦åˆ©ç”¨:
å…±é€šã®æŒ¯ã‚‹èˆžã„ã‚’æä¾›ã™ã‚‹ãŸã‚ã«æŠ½è±¡ã‚¯ãƒ©ã‚¹ã‚’å®šç¾©ã—ã€ã‚µãƒ–クラスãŒã“れを拡張ã—ã¦åˆ©ç”¨ã—ã¾ã™ã€‚
abstract class AbstractShape {
// ...
}
class Circle extends AbstractShape {
// ...
}
ã¾ã¨ã‚
ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ã¨æŠ½è±¡ã‚¯ãƒ©ã‚¹ã¯ã€ã‚ªãƒ–ジェクト指å‘プãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®è¨è¨ˆã«ãŠã„ã¦ç•°ãªã‚‹ç›®çš„ã§ä½¿ç”¨ã•れã¾ã™ã€‚抽象クラスã¯å…±é€šã®å®Ÿè£…ã‚’æä¾›ã—ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã¯å…±é€šã®æŒ¯ã‚‹èˆžã„を指定ã—ã¾ã™ã€‚ã“れらを組ã¿åˆã‚ã›ã¦æŸ”軟ãªã‚ªãƒ–ジェクトã®è¨è¨ˆã‚’行ã†ã“ã¨ã§ã€åŠ¹æžœçš„ã‹ã¤ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã—ã‚„ã™ã„コードを実ç¾ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
「018 オブジェクト指å‘ã®æ·±åŒ–ã€å•題集リスト
🎯 実習ã§ç†è§£ã‚’æ·±ã‚よã†
ã“ã®å†…容ã«ã¤ã„ã¦JavaDrillã§å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦å¦ç¿’ã§ãã¾ã™


コメント