1-qator: Nomlar maydonidan using System sinflardan foydalanishimiz mumkinligini anglatadi. 2-qator


using System; abstract class Tekislik { double


Download 0.73 Mb.
bet41/43
Sana08.10.2023
Hajmi0.73 Mb.
#1695516
1   ...   35   36   37   38   39   40   41   42   43
Bog'liq
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:
1   ...   35   36   37   38   39   40   41   42   43




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling