Çokbiçimlilik (İngilizcepolymorphism), bir türün bir başka tür gibi davranabilme ve bu tür gibi kullanılabilme özelliğidir. Nesne yönelimli programlama dillerinde çokbiçimlilik özelliği ise aynı temel sınıftan türetilmiş olan sınıflarda paylaşılan, başka bir ifadeyle aşırı yüklenen aynı metodun bu sınıflarda farklı şekillerde uyarlanabilmesidir. Nesnenin davranışı çalışma anında belirlendiği için programcılar, çokbiçimlilik özelliği sayesinde nesnelerin türünü önceden bilmek zorunda kalmaz.

Örnekler değiştir

C++ değiştir

#include <string>
#include <type_traits>
#include <iostream>

struct Animal {
  virtual ~Animal() = default;

  virtual std::string talk() const = 0;
};

struct Cat : public Animal {
  std::string talk() const override { return "Miyav!"; }
};

struct Dog : public Animal {
  std::string talk() const override { return "Hav! Hav!"; }
};

static_assert(std::is_polymorphic_v<Animal>);
static_assert(std::is_base_of_v<Animal, Cat>);
static_assert(std::is_base_of_v<Animal, Dog>);

std::string talk(const Animal& a) {
  return a.talk();
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}
// C++17 ve sonrasi std::variant tipi kullanarak
#include <string>
#include <variant>
#include <iostream>

struct Cat {
  std::string talk() const { return "Miyav!"; }
};

struct Dog {
  std::string talk() const { return "Hav! Hav!"; }
};

using Animal = std::variant<Cat, Dog>;

std::string talk(const Animal& a) {
  struct v {
    std::string operator()(const Dog& d) const { return d.talk(); }
    std::string operator()(const Cat& c) const { return c.talk(); }
  };

  return std::visit(v{}, a);
}

int main() {
  Cat minnos;
  Dog karabas;

  std::cout << talk(minnos) << '\n';  // Miyav!
  std::cout << talk(karabas) << '\n'; // Hav! Hav!
}

Java değiştir

 interface IHayvan {
    String isimAl();
    String konus();
 }

 abstract class TemelHayvanSinifi implements IHayvan {
    private final String isim;
    protected TemelHayvanSinifi(final String ISIM) {
        isim = ISIM;
    }
    public String isimAl() {
        return isim;
    }
 }

 class Kedi extends TemelHayvanSinifi {
    public Kedi(final String ISIM) {
        super(ISIM);
    }
    public String konus() {
        return "Miyav!";
    }
 }

 class Kopek extends TemelHayvanSinifi {
    public Kopek(final String ISIM) {
        super(ISIM);
    }
    public String konus() {
        return "Hav! Hav!";
    }
 }

 public class Test {
    public static void main(final String[] ARGUMENTS) {
        final IHayvan[] hayvanlar = {
            new Kedi("Mirnav"),
            new Kedi("Kara kedi"),
            new Kopek("Karabas")
        };
        for (final IHayvan hayvan : hayvanlar) {
            System.out.println(hayvan.isimAl() + ": " + hayvan.konus());
        }
    }
 }

Kaynakça değiştir