using System;
public abstract class Pokemon{
// Concrete method
public void Pikachu(){
Console.WriteLine("Pikachu");
}
// Abstract method
public abstract void typeWater();
// Abstract method
public abstract void typeFire();
}
การสร้างตัว Object เพื่อใช้เรียกใช้งานคลาสจะทำในส่วนของ Class main โดยการสร้าง Object เรียกใช้ Class ที่สืบทอดมาจาก Abstract class สามารถสร้างได้สองแบบ
class mainProgram{
static void Main(string[] args){
Pokemon Satoshi = new Trainer();
Satoshi.Pikachu();
Satoshi.typeWater();
Satoshi.typeFire();
}
}
using System;
// Abstract class
public abstract class Pokemon{
// Concrete method
public void Pikachu(){
Console.WriteLine("Pikachu");
}
// Abstract method
public abstract void typeWater();
// Abstract method
public abstract void typeFire();
}
class Trainer : Pokemon {
public override void typeWater(){
Console.WriteLine("Squirtle");
}
public override void typeFire(){
Console.WriteLine("Charmander");
}
}
class mainProgram{
static void Main(string[] args){
Pokemon Satoshi = new Trainer();
Satoshi.Pikachu();
Satoshi.typeWater();
Satoshi.typeFire();
}
}
Output
Pikachu
Squirtle
Charmander
Abstract class ที่ทำงานร่วมกับ get กับ set
using System;
public abstract class Pokemon{
// Abstract properties
public abstract int Power{
get;
set;
}
}
class Ivysaur : Pokemon {
public int p;
public override int Power{
get{ return p; }
set{ p = value; }
}
}
public class main{
public static void Main(string[] args){
Ivysaur i = new Ivysaur();
// Set
i.Power = 9999;
// Get
Console.WriteLine(i.Power);
}
}
Output
9999
เปรียบเทียบการใช้ Abstract class กับภาษาอื่น
using System;
// Abstract class
public abstract class Pokemon{
// Abstract properties
public abstract int Power{ get; set; }
// Abstract class
public abstract void Type();
}
class Ivysaur : Pokemon {
public int p;
public Ivysaur(){
Console.WriteLine("Ivysaur");
}
public override int Power{
get{ return p; }
set{ p = value; }
}
public override void Type(){
Console.WriteLine("Water");
}
}
class mainProgram{
static void Main(string[] args){
Ivysaur i = new Ivysaur();
// Setter
i.Power = 9999;
// Getter
Console.WriteLine(i.Power);
i.Type();
}
}
Output
Ivysaur
9999
Water
// Abstract class
abstract class Pokemon {
// Abstract property
public abstract int getPower();
public abstract void setPower(int value);
// Abstract method
public abstract void Type();
}
class Ivysaur extends Pokemon {
public int p;
// Constructor
public Ivysaur() {
System.out.println("Ivysaur");
}
@Override
public int getPower() {
return p;
}
@Override
public void setPower(int value) {
this.p = value;
}
@Override
public void Type() {
System.out.println("Water");
}
}
public class Main {
public static void main(String[] args) {
Ivysaur i = new Ivysaur();
// Set Power
i.setPower(9999);
// Get Power
System.out.println(i.getPower());
i.Type();
}
}
Output
Ivysaur
9999
Water
#include <iostream>
using namespace std;
// Abstract class
class Pokemon {
public:
// Pure virtual function
virtual int getPower() const = 0;
virtual void setPower(int power) = 0;
// Pure virtual function
virtual void Type() = 0;
virtual ~Pokemon() {}
};
class Ivysaur : public Pokemon {
public:
int p;
// Constructor
Ivysaur() {
cout << "Ivysaur" << endl;
}
// Override
int getPower() const override {
return p;
}
// Override
void setPower(int power) override {
p = power;
}
// Override
void Type() override {
cout << "Water" << endl;
}
};
int main() {
Ivysaur i;
// Setter
i.setPower(9999);
// Getter
cout << i.getPower() << endl;
i.Type();
return 0;
}
Output
Ivysaur
9999
Water
from abc import ABC, abstractmethod
# Abstract class
class Pokemon(ABC):
@property
@abstractmethod
def Power(self):
pass
@Power.setter
@abstractmethod
def Power(self, value):
pass
# Abstract method
@abstractmethod
def Type(self):
pass
class Ivysaur(Pokemon):
def __init__(self):
self._p = 0
print("Ivysaur")
@property
def Power(self):
return self._p
@Power.setter
def Power(self, value):
self._p = value
def Type(self):
print("Water")
if __name__ == "__main__":
i = Ivysaur()
# Set Power
i.Power = 9999
# Get Power
print(i.Power)
i.Type()
// Abstract class
abstract class Pokemon {
// Abstract property
public abstract int getPower();
public abstract void setPower(int value);
// Abstract method
public abstract void Type();
}
class Ivysaur extends Pokemon {
public int p;
// Constructor
public Ivysaur() {
System.out.println("Ivysaur");
}
@Override
public int getPower() {
return p;
}
@Override
public void setPower(int value) {
this.p = value;
}
@Override
public void Type() {
System.out.println("Water");
}
}
public class Main {
public static void main(String[] args) {
Ivysaur i = new Ivysaur();
// Set Power
i.setPower(9999);
// Get Power
System.out.println(i.getPower());
i.Type();
}
}
Output
Ivysaur
9999
Water
เนื่องจากภาษา Java ไม่ได้รองรับการทำงานแบบ Abstract property ทำให้ไม่สามารถใช้งานในรูปแบบ public abstract int Power { get; set; } เหมือนภาษา C# ได้ แต่เราสามารถกำหนดเมดธอด Getter กับ Setter ได้โดยสร้างเป็นเมดธอดปกติที่ทำงานเหมือนกันได้
C++
Abstract class in C++
ในภาษา C++ มีการสร้าง Abstract class คลาสเหมือนคลาสปกติทั่วไปแต่เมื่อมี Pure virtual method เพียงอันเดียวจะถือว่าคลาสนั้นเป็น Abstract class ทันที
Abstract method จะถูกเรียกว่า Pure virtual function ใน C++ และการกำหนดให้ = 0 เพื่อทำให้เป็น Pure virtual function เป็นการบังคับให้ไม่มีการ Implement เนื้อหาข้างในแต่ให้คลาสที่จะมาสืบทอดทำในส่วนนั้นแทน
#include <iostream>
using namespace std;
// Abstract class Pokemon
class Pokemon {
public:
// Pure virtual function
virtual void Type() = 0;
virtual ~Pokemon() {}
};
Inheritance
จะใส่ : หลังชื่อคลาสตามด้วยชื่อ Abstract class ที่ต้องการจะสืบทอด เมดธอดที่ Override จาก Abstract class จะมี Keyword ว่า override หลังชื่อคลาส
class Ivysaur : public Pokemon {
public:{
// Override
void Type() override {
cout << "Water" << endl;
}
};