1-qator: Nomlar maydonidan using System sinflardan foydalanishimiz mumkinligini anglatadi. 2-qator
using System; abstract class Tekislik { double
Download 0.73 Mb.
|
C# asoslari
using System;
abstract class Tekislik { double a; double h; // Standart konstruktor public Tekislik() { Asos = Balandlik = 0.0; nom = "null"; } // Parametrli konstruktor public Tekislik(double w, double h, string n) { Asos = w; Balandlik = h; nom = n; } // Bir xil asos va balandlikdagi konstruktor public Tekislik(double x, string n) { Asos = Balandlik = x; nom = n; } 5 // Tekislik obyektining nusxasi public Tekislik(Tekislik obyekt) { Asos = obyekt.Asos; Balandlik = obyekt.Balandlik; nom = obyekt.nom; } // Obyektning asosi va balandligi xossalari public double Asos { get { return a; } set { a = value < 0 ? -value : value; } } public double Balandlik { get { return h; } set { h = value < 0 ? -value : value; } } public string nom { get; set; } public void Show() { Console.WriteLine("Asos va Balandlik: " + Asos + " va " + Balandlik); } // Endi Yuza() metodi abstrakt public abstract double Yuza(); } // Tekislik sinfidan voris olingan Uchburchak sinfi class Uchburchak : Tekislik { string UchburchakTuri; // Standart konstruktor public Uchburchak() { UchburchakTuri = "null"; } //Uchburchak sinfi uchun konstruktor 6 public Uchburchak(string s, double w, double h) : base(w, h, "uchburchak") { UchburchakTuri = s; } // Teng yonli uchburchak public Uchburchak(double x) : base(x, "uchburchak") { UchburchakTuri = "teng yonli"; } // Uchburchak turidagi obyektning nusxasi public Uchburchak(Uchburchak obyekt) : base(obyekt) { UchburchakTuri = obyekt.UchburchakTuri; } // Uchburchak sinfi uchun Yuza() metodini bekor qilish public override double Yuza() { return Asos * Balandlik / 2; } // Uchburchak turini ko‘rsatish public void ShowUchburchakTuri() { Console.WriteLine("Uchburchak: " + UchburchakTuri); } } // Tekislik sinfidan voris olingan Turtburchak sinfi class Turtburchak : Tekislik { // Turtburchak sinfi uchun konstruktor public Turtburchak(double w, double h) : base(w, h, "to‘g‘ri to‘rtburchak") { } // Kvadrat konstruktori public Turtburchak(double x) : base(x, "to‘g‘ri to‘rtburchak") { } // Turtburchak turidagi obyektning nusxasi 7 public Turtburchak(Turtburchak obyekt) : base(obyekt) { } // Agar to‘rtburchak kvadrat bo‘lsa, true qiymatini qaytaradi public bool Kvadrat() { if (Asos == Balandlik) return true; return false; } // Turtburchak sinfi uchun Yuza() metodini bekor qilish public override double Yuza() { return Asos * Balandlik; } } class AbsShakl { static void Main() { Tekislik[] shakllar = new Tekislik[4]; shakllar[0] = new Uchburchak("to‘g‘ri burchakli", 8.0, 12.0); shakllar[1] = new Turtburchak(10); shakllar[2] = new Turtburchak(10, 4); shakllar[3] = new Uchburchak(7.0); for (int i = 0; i < shakllar.Length; i++) { Console.WriteLine("Obyekt - " + shakllar[i].nom); Console.WriteLine("Yuza: " + shakllar[i].Yuza()); Console.WriteLine(); } Console.ReadKey(); } } Dastur natijasi quyidagicha: Obyekt - uchburchak Yuza: 48 Obyekt - to'g'ri to'rtburchak Yuza: 100 8 Obyekt - to'g'ri to'rtburchak Yuza: 40 Obyekt - uchburchak Yuza: 24,5 Yuqoridagi dastur kodidan ko‘rinib turibdiki, barcha voris sinflarda Yuza() metodi bekor qilingan va abstract deb e’lon qilingan. Yuza() metodini bekor qilmaydigan voris sinf yaratilgan. Bu yerda, kompilyatsiya paytida xatolik kelib chiqadi. Tekislik turidagi obyektlarga havolalar yaratish imkoniyati ham mavjud va bu yuqoridagi dasturda amalga oshirildi, lekin Tekislik turidagi obyektlarni e’lon qilib bo‘lmaydi. Shuning uchun shakllar massivi Main() metodida 4 ta elementga qisqartiriladi va umumiy ikki oʻlchovli shakl uchun Tekislik turidagi obyekt yaratilmaydi. Tekislik sinfi ham Show() metodini o‘z ichiga oladi va u abstract modifikator bilan e’lon qilinmaydi. Abstrakt sinflar uchun asl shaklda qo‘llanilishi mumkin bo‘lgan metodlarni voris sinfga kiritish ma’qul va faqat abstract deb e’lon qilingan metodlar voris sinflarda e’lon qilinishi kerak. Quyidagi dastur kodida abstrakt sinfni namoyish etishga oid yana bitta misol keltirilgan: using System; namespace AbstraktSinf { abstract class Shakl { public abstract int area(); } class Turtburchak: Shakl { private int length; private int width; public Turtburchak( int a = 0, int b = 0) { length = a; width = b; } public override int area () { Console.WriteLine("To‘rtburchak sinf maydoni :"); return (width * length); } } class TurtburchakTester { 9 static void Main(string[] args) { Turtburchak r = new Turtburchak(10, 7); double a = r.area(); Console.WriteLine("Maydon: {0}",a); Console.ReadKey(); } } } Yuqoridagi kod kompilyatsiya qilinganda quyidagi natijani beradi: To‘rtburchak sinf maydoni: Maydon: 70 Abstrakt sinf a'zolari Odatdagi xossalar va metodlardan tashqari, abstrakt sinf abstract kalit so'z yordamida aniqlangan va hech qanday funksionallikka ega bo'lmagan abstrakt sinf a'zolariga ega bo'lishi mumkin. Xususan sinfning quyidagi a’zolari abstrakt bo'lishi mumkin: Metodlar Xossalar Indeksatorlar Hodisalar Abstrakt sinf a'zolari private modifikatorga ega bo'lmasligi kerak. Bunday holda, voris sinf asosiy abstrakt sinfdagi barcha abstrakt metodlar va xossalarni bekor qilishi va amalga oshirishi kerak. Voris sinfda bekor qilinganda, bunday metod yoki xossa override modifikatori bilan ham e'lon qilinadi. Agar sinfda kamida bitta abstrakt metod (yoki abstrakt xossa, indeksator, hodisa) bo'lsa, u holda bu sinf abstrakt sifatida belgilanishi kerak. Abstrakt a'zolar, virtual a'zolar kabi, polimorf interfeysning bir qismidir. Ammo virtual metodlarda voris sinf amalga oshirishni voris qilib oladi desak, abstrakt metodlarda ushbu abstrakt metodlar bilan ifodalangan interfeys voris qilib olinadi. Abstrakt xossalar Abstrakt xossalarning ta'rifi avtoxossalarning ta'rifiga o'xshaydi. Masalan: abstract class Transport { // tezlikni saqlash uchun abstrakt xossa public abstract int Speed { get; set; } } // Kema sinfi class Ship : Transport { 10 int speed; public override int Speed { get => speed; set => speed = value; } } class Aircraft : Transport { public override int Speed { get; set; } } Transport sinfi tezlikni saqlashi kerak bo'lgan Speed abstrakt xossani belgilaydi. Bu avtoxossaga o'xshaydi, lekin u avtoxossa emas. Ushbu xossa amalga oshirishi shart emasligi sababli, unda faqat get va set bloklari mavjud. Voris sinflarda bu xossani to'liq xossaga aylantirish (Ship sinfidagi kabi) yoki uni avtomatik (Aircraft sinfidagi kabi) bekor qilish mumkin. Abstrakt a'zolarni amalga oshirishni bekor qilish Voris sinf asosiy sinfning barcha abstrakt a'zolarini amalga oshirishi kerak. Lekin uni amalga oshirmaslik ham mumkin, bu holda voris sinf ham abstrakt sifatida belgilanishi kerak: using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { Transport tesla = new Auto(); tesla.Move(); Console.ReadKey(); } } abstract class Transport { public abstract void Move(); } // Mshina sinfi abstract class Car :Transport {} class Auto: Car 11 { public override void Move() { Console.WriteLine("Mashina yurmoqda"); } } } Bunday holda, Car sinfi Transport asosiy sinfining abstrakt Move metodini amalga oshirmaydi va shuning uchun ham abstrakt sifatida aniqlanadi. Biroq, Car sinfidan voris olingan har qanday abstrakt bo'lmagan sinflar ham barcha voris olingan abstrakt metodlar va xossalarni amalga oshirishi kerak. Abstrakt sinfga misol Abstrakt sinflarga misol qilib geometrik shakllar sistemasini keltirish mumkin. Aslida, bunday geometrik shakl yo'q. Doira, to'rtburchak, kvadrat bor, lekin oddiygina shakl yo'q. Biroq, aylana ham, to'rtburchak ham umumiy narsaga ega va ular shakllardir: using System; namespace ConsoleApp3 { internal class Program { static void Main(string[] args) { var t = new Rectangle { Width = 20, Height = 20 }; var d = new Circle { Radius = 200 }; PrintShape(t); // Perimetr: 80 Yuza: 400 PrintShape(d); // Perimetr: 1256 Yuza: 125600 void PrintShape(Shape shape) { Console.WriteLine($"Perimetr: {shape.Perimetr()} Yuza: {shape.Yuza()}"); } Console.ReadKey(); } } // Abstrakt shakllar sinfi abstract class Shape { // perimetrni hisoblash abstrakt metodi 12 public abstract double Perimetr(); // Yuzani hisoblash abstrakt metodi public abstract double Yuza(); } // To'rtburchak voris sinfi class Rectangle : Shape { public float Width { get; set; } public float Height { get; set; } // perimetrni olishni bekor qilish Download 0.73 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling