Bir nechta interfeysni amalga oshirish
Interfeyslar yana bir muhim funktsiyaga ega: C # bir nechta merosni qo'llab-quvvatlamaydi, ya'ni biz bir sinfdan faqat bitta klassdan meros olishimiz mumkin, farqli o'laroq, C ++ tilida, ko'pgina merosdan foydalanish mumkin. Interfeyslar ushbu cheklovni qisman chetlab o'tishlari mumkin, chunki C # sinfida bir vaqtning o'zida bir nechta interfeyslarni amalga oshirish mumkin. Amalga oshirilgan barcha interfeyslar vergul bilan ajratilgan:
myClass: myInterface1, myInterface2, myInterface3, ...
{
}
|
Quyidagi misolni ko'rib chiqamiz:
using System;
namespace HelloApp
{
interface IAccount
{
int CurrentSum { get; } // Текущая сумма на счету
void Put(int sum); // Положить деньги на счет
void Withdraw(int sum); // Взять со счета
}
interface IClient
{
string Name { get; set; }
}
class Client : IAccount, IClient
{
int _sum; // Переменная для хранения суммы
public string Name { get; set; }
public Client(string name, int sum)
{
Name = name;
_sum = sum;
}
|
public int CurrentSum { get { return _sum; } }
public void Put(int sum) { _sum += sum; }
public void Withdraw(int sum)
{
if (_sum >= sum)
{
_sum -= sum;
}
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client("Tom", 200);
client.Put(30);
Console.WriteLine(client.CurrentSum); //230
client.Withdraw(100);
Console.WriteLine(client.CurrentSum); //130
Console.Read();
}
}
}
|
Bunday holda, ikkita interfeys aniqlanadi. IAccount interfeysi hisobdagi joriy pul miqdori uchun CurrentSum xususiyatini va hisobvaraqqa pul qo'shish va pulni olishning ikkita "Put" va "Olib tashlash" usullarini belgilaydi. IClient interfeysi mijoz nomini saqlash xususiyatini belgilaydi.
E'tibor bering, interfeyslarda CurrentSum va Name xususiyatlari avtomatik xususiyatlarga o'xshash, ammo ular avtomatik xususiyatlarga ega emas. Amalga oshirish jarayonida biz ularni to'liq xususiyatlarga ega bo'lishimiz yoki ularni avtomatik xususiyatlarga aylantirishimiz mumkin.
Client sinfi ikkala interfeysni ham amalga oshiradi va keyinchalik dasturda qo'llaniladi.
Turli konversiyalardagi interfeyslar.
Turni konversiyalash bo'yicha aytilganlarning hammasi interfeyslarga xosdir.
Client sinfi IAccount interfeysini amalga oshirgani uchun, IAccount turidagi o'zgaruvchi Client turidagi ob'ektga mos yozuvlar saqlashi mumkin:
// Barcha Client ob'ektlari IAccount ob'ektlari
IAccount account = new Client("Том", 200);
account.Put(200);
Console.WriteLine(account.CurrentSum); // 400
// IAccount ob'ektlarining hammasi ham Client ob'ekti emas, aniq kasting talab etiladi
Client client = (Client)account;
// IAccount interfeysida Name xususiyati mavjud emas, aniq namoyish talab qilinadi
string clientName = ((Client)account).Name;
|
Sinfdan interfeysga, shuningdek, olingan turdan bazaviy turga o'tkazish avtomatik ravishda amalga oshiriladi. Har qanday Client ob'ekti IAccount interfeysini amalga oshiradi.
Teskari konversiya - interfeysdan uni amalga oshiradigan sinfga o'tish, asosiy sinfdan olingan sinfga o'tish kabi bo'ladi. Har bir IAccount ob'ekti Client ob'ekti bo'la olmasligi (oxir-oqibat, boshqa sinflar IAccount interfeysini amalga oshirishi mumkin), bunday konversiya uchun ishlash zarur. Va agar biz IAccount interfeysida aniqlanmagan, ammo Client klassining bir qismi bo'lgan Mijoz sinfining usullariga murojaat qilmoqchi bo'lsak, unda konversiyani aniq amalga oshirishimiz kerak: string clientName = ((Client) account) .Name;
Do'stlaringiz bilan baham: |