Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Değiştirici, abstract değiştirilen şeyin eksik veya tamamlanmamış bir uygulaması olduğunu gösterir. Soyut değiştirici sınıflar, yöntemler, özellikler, dizin oluşturucular ve olaylarla kullanılabilir. 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 olarak işaretlenen üyeler, soyut sınıftan türetilen soyut olmayan sınıflar tarafından uygulanmalıdır.
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, 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.
Örnek 1 - 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 - bunlar tüm araçlar için ortak işlevsellik sağlar. -
Soyut üyeler:
Move()yöntem veMaxSpeedözellik - bunlar belirli araç türleri 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.
Örnek 2
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 sınıf örneği oluşturulamaz.
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 karşıt anlamları olduğundan, korumalı değiştirici ile bir soyut sınıfı değiştirmek mümkün değildir. Değiştirici,
sealedbir sınıfın devralınmasını engeller veabstractdeğ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 ve imzayı izleyen küme ayracı ({ }) yoktur. Örneğin:
public abstract void MyMethod();Uygulama, soyut olmayan bir sınıfın üyesi olan bir yöntem geçersiz kılma tarafından sağlanır.
Soyut yöntem bildiriminde statik veya sanal değiştiricilerin kullanılması bir hatadır.
Soyut özellikler, bildirim ve çağırma söz dizimindeki farklar dışında soyut yöntemler gibi davranır.
Değiştiriciyi
abstractstatik bir özellikte kullanmak bir hatadır.Soyut devralınan özellik, geçersiz kılma değiştiricisini kullanan 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();
}
Örnek 3
Bu örnekte, sınıfı DerivedClass soyut bir sınıfından BaseClasstüretilmiştir. 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şturamadığını belirten bir hata alırsınız.
Bununla birlikte, aşağıdaki örnekte olduğu gibi soyut bir sınıf oluşturucu kullanmak mümkündür
Örnek 4
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ı abstractolarak bildirilmiş, yani doğrudan örneklendirilemez. 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, yani yalnızca türetilmiş sınıflardan erişilebilir. Bu durumda,Shapeoluşturucu bircolorparametresi alır veColorö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 vecolorbağımsız değişkenini ona geçirir. - Shape sınıfında, tanımlanan oluşturucu
protected Shape(string color)parametresi olarak bir renk alır. Bu, artık C# tarafından otomatik olarak sağlanan varsayılan bir parametresiz oluşturucu olmadığı anlamına gelir, bu nedenle türetilmiş sınıfların temel oluşturucuyu çağırmak için: base(color)ifadesini kullanması gerekir. Varsayılan değerin renkprotected Shape(string color="green")olarak ayarlanması, türetilmiş sınıflardaki: base(color)ifadesinin atlanması için izin verir; yine de bu tür oluşturucuprotected Shape(string color="green")çağrılır ve renk yeşil olarak ayarlanır.
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.