Aracılığıyla paylaş


abstract (C# Başvurusu)

Değiştirici, abstract hedefinin eksik veya tamamlanmamış bir uygulaması olduğunu gösterir. Sınıflar, yöntemler, özellikler, dizin oluşturucular ve olaylarla soyut değiştiriciyi kullanın. Bir sınıfın yalnızca diğer sınıfların abstract temel sınıfı olması amaçlandığını belirtmek için sınıf bildiriminde değiştiriciyi kullanın, kendi başına örneklenmez. Soyut sınıftan türetilen soyut olmayan sınıfların soyut olarak işaretlenmiş üyeleri uygulaması gerekir.

C# dili başvuru belgesi, C# dilinin en son yayımlanan sürümünü gösterir. Ayrıca, yaklaşan dil sürümü için genel önizlemelerdeki özelliklere yönelik ilk belgeleri içerir.

Belgelerde ilk olarak dilin son üç sürümünde veya geçerli genel önizlemelerde sunulan tüm özellikler tanımlanır.

Tavsiye

Bir özelliğin C# dilinde ilk tanıtıldığı zamanları bulmak için C# dil sürümü geçmişi makalesine bakın.

Soyut sınıflar hem soyut üyeleri (uygulaması olmayan ve türetilmiş sınıflarda geçersiz kılınması gereken) hem de tam olarak uygulanan üyeleri (normal yöntemler, özellikler ve oluşturucular gibi) içerebilir. Bu özellik, soyut sınıfların ortak işlevsellik sağlarken belirli soyut üyeleri uygulamak için türetilmiş sınıflar gerektirmesine olanak tanır.

Uyarı

Arabirim üyeleri varsayılan olarak vardır abstract .

Karma üyelerle soyut sınıf

Aşağıdaki örnekte hem uygulanan yöntemleri hem de soyut üyeleri içeren bir soyut sınıf gösterilmektedir:

namespace LanguageKeywords;

public abstract class Vehicle
{
    protected string _brand;
    
    // Constructor - implemented method in abstract class
    public Vehicle(string brand) => _brand = brand;
    
    // Implemented method - provides functionality that all vehicles share
    public string GetInfo() => $"This is a {_brand} vehicle.";
    
    // Another implemented method
    public virtual void StartEngine() => Console.WriteLine($"{_brand} engine is starting...");
    
    // Abstract method - must be implemented by derived classes
    public abstract void Move();
    
    // Abstract property - must be implemented by derived classes  
    public abstract int MaxSpeed { get; }
}

public class Car : Vehicle
{
    public Car(string brand) : base(brand) { }
    
    // Implementation of abstract method
    public override void Move() => Console.WriteLine($"{_brand} car is driving on the road.");
    
    // Implementation of abstract property
    public override int MaxSpeed => 200;
}

public class Boat : Vehicle
{
    public Boat(string brand) : base(brand) { }
    
    // Implementation of abstract method
    public override void Move() => Console.WriteLine($"{_brand} boat is sailing on the water.");
    
    // Implementation of abstract property
    public override int MaxSpeed => 50;
}

public class AbstractExample
{
    public static void Examples()
    {
        // Cannot instantiate abstract class: Vehicle v = new Vehicle("Generic"); // Error!
        
        Car car = new Car("Toyota");
        Boat boat = new Boat("Yamaha");
        
        // Using implemented methods from abstract class
        Console.WriteLine(car.GetInfo());
        car.StartEngine();
        
        // Using abstract methods implemented in derived class
        car.Move();
        Console.WriteLine($"Max speed: {car.MaxSpeed} km/h");
        
        Console.WriteLine();
        
        Console.WriteLine(boat.GetInfo());
        boat.StartEngine();
        boat.Move();
        Console.WriteLine($"Max speed: {boat.MaxSpeed} km/h");
    }
}

class Program
{
    static void Main()
    {
        AbstractExample.Examples();
    }
}
/* Output:
This is a Toyota vehicle.
Toyota engine is starting...
Toyota car is driving on the road.
Max speed: 200 km/h

This is a Yamaha vehicle.
Yamaha engine is starting...
Yamaha boat is sailing on the water.
Max speed: 50 km/h
*/

Bu örnekte soyut Vehicle sınıf şunları sağlar:

  • Uygulanan üyeler: GetInfo() yöntem, StartEngine() yöntem ve oluşturucu - bu üyeler tüm araçlar için ortak işlevsellik sağlar.
  • Soyut üyeler: Move() yöntem ve MaxSpeed özellik - bu üyeler her bir araç türü tarafından uygulanmalıdır.

Bu tasarım, soyut sınıfın paylaşılan işlevsellik sağlarken türetilmiş sınıfların araca özgü davranışlar uyguladığından emin olmasını sağlar.

Soyut sınıftan türetilen somut sınıf

Bu örnekte sınıfıSquare, öğesinden GetAreatüretildiği için uygulamasını Shape sağlamalıdır:

abstract class Shape
{
    public abstract int GetArea();
}

class Square : Shape
{
    private int _side;

    public Square(int n) => _side = n;

    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => _side * _side;

    static void Main()
    {
        var sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
    }
}
// Output: Area of the square = 144

Soyut sınıflar aşağıdaki özelliklere sahiptir:

  • Soyut bir sınıfın örneğini oluşturamazsınız.
  • Soyut sınıf soyut yöntemler ve erişimciler içerebilir.
  • Soyut sınıf, türetilmiş sınıflara işlevsellik sağlayan uygulanan yöntemleri, özellikleri, alanları ve diğer üyeleri de içerebilir.
  • İki değiştiricinin sealed karşıt anlamları olduğundan, değiştiriciyi soyut bir sınıfta kullanamazsınız. Değiştirici, sealed bir sınıfın devralınmasını engeller ve abstract değiştirici bir sınıfın devralınmasını gerektirir.
  • Soyut sınıftan türetilen soyut olmayan bir sınıf, devralınan tüm soyut yöntemlerin ve erişimcilerin gerçek uygulamalarını içermelidir.

Yöntemin veya özelliğin abstract uygulama içermediğini belirtmek için bir yöntem veya özellik bildiriminde değiştiriciyi kullanın.

Soyut yöntemler aşağıdaki özelliklere sahiptir:

  • Soyut yöntem örtük olarak bir sanal yöntemdir.

  • Soyut yöntem bildirimlerine yalnızca soyut sınıflarda izin verilir.

  • Soyut yöntem bildirimi gerçek bir uygulama sağlamadığından, yöntem gövdesi yoktur. Yöntem bildirimi yalnızca noktalı virgülle biter. Örneğin:

    public abstract void MyMethod();
    

    Uygulama, soyut olmayan bir sınıfın üyesi olan bir yöntemi overridetarafından sağlanır.

  • Bir türdeki static soyut yöntem bildiriminde veya virtual değiştiricilerini kullanmak bir class hatadır. ve static virtual yöntemlerini arabirimlerde bildirebilirsinizstatic abstract.

    Soyut özellikler, bildirim ve çağırma söz dizimindeki farklar dışında soyut yöntemler gibi davranır.

  • Bir türdeki statik özellikte değiştiriciyi abstract kullanmak bir class hatadır. Arabirim bildirimlerinde veya static virtual özellikleri bildirebilirsinizstatic abstract.

  • Soyut devralınan özellik, değiştiriciyi kullanan override bir özellik bildirimi dahil edilerek türetilmiş bir sınıfta geçersiz kılınabilir.

Soyut sınıflar hakkında daha fazla bilgi için bkz . Soyut ve Korumalı Sınıflar ve Sınıf Üyeleri.

Soyut bir sınıf tüm arabirim üyeleri için uygulama sağlamalıdır. Bir arabirim uygulayan soyut sınıf, arabirim yöntemlerini soyut yöntemlerle eşler. Örneğin:

interface I
{
    void M();
}

abstract class C : I
{
    public abstract void M();
}

Aşağıdaki örnekte, sınıfı DerivedClass soyut bir sınıfından BaseClasstüretilir. soyut sınıfı bir soyut yöntem AbstractMethod, ve iki soyut özellik X ve Yiçerir.

// Abstract class
abstract class BaseClass
{
    protected int _x = 100;
    protected int _y = 150;

    // Abstract method
    public abstract void AbstractMethod();

    // Abstract properties
    public abstract int X { get; }
    public abstract int Y { get; }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        _x++;
        _y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return _x + 10;
        }
    }

    public override int Y   // overriding property
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        var o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine($"x = {o.X}, y = {o.Y}");
    }
}
// Output: x = 111, y = 161

Yukarıdaki örnekte aşağıdaki gibi bir deyim kullanarak soyut sınıfın örneğini oluşturmayı denerseniz:

BaseClass bc = new BaseClass();   // Error

Derleyicinin 'BaseClass' soyut sınıfının bir örneğini oluşturadığını belirten bir hata alıyorsunuz. Bununla birlikte, aşağıdaki örnekte gösterildiği gibi soyut bir sınıf oluşturucu kullanabilirsiniz.

public abstract class Shape
{
    public string Color { get; set; }

    // Constructor of the abstract class
    protected Shape(string color)
    {
        Color = color;
        Console.WriteLine($"Created a shape with color {color}.");
    }

    // Abstract method that must be implemented by derived classes
    public abstract double CalculateArea();
}

public class Square : Shape
{
    public double Side { get; set; }

    // Constructor of the derived class calling the base class constructor
    public Square(string color, double side) : base(color)
    {
        Side = side;
    }

    public override double CalculateArea()
    {
        return Side * Side;
    }
}

public class Program
{
    public static void Main(string[] args)
     {
            Square square = new Square("red", 5);
            Console.WriteLine($"Area of the square: {square.CalculateArea()}");            
     }
}

Shape sınıfı olarak bildirilirabstract, yani doğrudan örneği oluşturamazsınız. Bunun yerine, diğer sınıflar için bir şema görevi görür.

  • Soyut bir sınıfın nesnelerini oluşturamasanız da, yine de bir oluşturucuya sahip olabilir. Bu oluşturucu genellikle protected,yalnızca türetilmiş sınıfların erişebileceği anlamına gelir. Bu durumda, Shape oluşturucu bir color parametresi alır ve Color özelliğini başlatır. Ayrıca konsola bir ileti yazdırır. public Square(string color, double side) : base(color) bölümü temel sınıfın oluşturucusunu (Shape) çağırır ve color bağımsız değişkenini ona geçirir.
  • Shape sınıfında, tanımlı oluşturucu parametre protected Shape(string color)olarak bir renk alır. Bu, C# artık otomatik olarak varsayılan bir parametresiz oluşturucu sağlamaz anlamına gelir. Türetilmiş sınıflar, temel oluşturucuyu : base(color) çağırmak için ifadesini kullanmalıdır. Varsayılan değerin renk protected Shape(string color="green") olarak ayarlanması, türetilmiş sınıflarda ifadenin : base(color) atılmasına olanak tanır. Oluşturucu protected Shape(string color="green") rengi yeşil olarak ayarlar.

C# Dil Belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.