namespace ObiektowaTeoria { // Klasa abstrakcyjna - a, która nie może być bezpośrednio // zainstancjonowana (nie można tworzyć jej obiektów). Deklaruje się // ją za pomocą słowa kluczowego za pomocą "abstract". Może zawierać zarówno // metody abstrakcyjne (bez implementacji), jak i metody z implementacją. // Służy jako szablon dla klas dziedziczących, zapewniając wspólny interfejs i // bazową funkcjonalność. Klasy dziedziczące muszą implementować wszystkie metody // abstrakcyjne. public abstract class Figura { public abstract double Pole(); } // Klasa dziedzicząca implementująca abstrakcyjną metodę public class Kwadrat : Figura { public double Bok; public Kwadrat(double bok) { Bok = bok; } public override double Pole() { return Bok * Bok; } } // Interfejs - czysty kontrakt, który definiuje metody i właściwości, ale nie zawiera ich implementacji. // Definiuje się go za pomocą słowa kluczowego interface. Klasy implementujące interfejs muszą dostarczyć implementację // wszystkich jego metod. Pozwala na tworzenie luźno powiązanych komponentów i ułatwia wielodziedziczenie zachowań. public interface IRysowalny { void Rysuj(); } // Klasa implementująca interfejs public class Kolo : IRysowalny { public double Promien; public Kolo(double promien) { Promien = promien; } public void Rysuj() { Console.WriteLine("Rysuję koło o promieniu " + Promien); } } }