TypeScript - Sınıflar
TypeScript, nesne yönelimli JavaScript'tir. TypeScript, sınıflar, arabirimler vb. Gibi nesne yönelimli programlama özelliklerini destekler. OOP açısından bir sınıf, nesneler oluşturmak için bir plandır. Bir sınıf, nesne için verileri kapsüller. Typescript, sınıf adı verilen bu kavram için yerleşik destek sağlar. JavaScript ES5 veya önceki sürümler sınıfları desteklemiyordu. Typescript bu özelliği ES6'dan alır.
Sınıflar oluşturma
TypeScript'te bir sınıf bildirmek için class anahtar sözcüğünü kullanın. Aynı sözdizimi aşağıda verilmiştir -
Sözdizimi
class class_name {
//class scope
}
Class anahtar sözcüğünden sonra sınıf adı gelir. Bir sınıfı adlandırırken tanımlayıcılara ilişkin kurallar dikkate alınmalıdır.
Bir sınıf tanımı aşağıdakileri içerebilir -
Fields- Alan, bir sınıfta belirtilen herhangi bir değişkendir. Alanlar, nesnelerle ilgili verileri temsil eder
Constructors - Sınıfın nesneleri için bellek ayırmaktan sorumlu
Functions- İşlevler, bir nesnenin gerçekleştirebileceği eylemleri temsil eder. Bazen yöntemler olarak da anılırlar
Bir araya getirilen bu bileşenler, sınıfın veri üyeleri olarak adlandırılır.
Daktilo içinde bir sınıf Kişi düşünün.
class Person {
}
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var Person = (function () {
function Person() {
}
return Person;
}());
Örnek: Bir sınıf bildirmek
class Car {
//field
engine:string;
//constructor
constructor(engine:string) {
this.engine = engine
}
//function
disp():void {
console.log("Engine is : "+this.engine)
}
}
Örnek, bir sınıf Araba ilan eder. Sınıfın motor adında bir alanı vardır. varbir alan bildirilirken anahtar kelime kullanılmaz. Yukarıdaki örnek, sınıf için bir yapıcı bildirir.
Yapıcı, sınıfın değişkenlerini başlatmaktan sorumlu olan sınıfın özel bir işlevidir. TypeScript, yapıcı anahtar sözcüğünü kullanarak bir yapıcı tanımlar. Yapıcı bir işlevdir ve dolayısıyla parametreleştirilebilir.
thisanahtar kelime, sınıfın mevcut örneğini ifade eder. Burada, sınıfın alanının parametre adı ve adı aynıdır. Dolayısıyla, belirsizliği önlemek için, sınıfın alanına ön ek olarakthis anahtar kelime.
disp () basit bir işlev tanımıdır. Function anahtar kelimesinin burada kullanılmadığına dikkat edin.
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var Car = (function () {
//constructor
function Car(engine) {
this.engine = engine;
}
//function
Car.prototype.disp = function () {
console.log("Engine is : " + this.engine);
};
return Car;
}());
Örnek nesneler oluşturma
Sınıfın bir örneğini oluşturmak için, newanahtar kelime ve ardından sınıf adı. Aynı sözdizimi aşağıda verilmiştir -
Sözdizimi
var object_name = new class_name([ arguments ])
new anahtar kelime somutlaştırmadan sorumludur.
İfadenin sağ tarafı kurucuyu çağırır. Yapıcı, parametreleştirilmişse değerler geçirilmelidir.
Örnek: Bir sınıfın somutlaştırılması
var obj = new Car("Engine 1")
Niteliklere ve İşlevlere Erişim
Bir sınıfın özniteliklerine ve işlevlerine nesne aracılığıyla erişilebilir. Kullan ' . Bir sınıfın veri üyelerine erişmek için nokta notasyonu (nokta olarak adlandırılır).
//accessing an attribute
obj.field_name
//accessing a function
obj.function_name()
Örnek: Onları bir araya getirmek
class Car {
//field
engine:string;
//constructor
constructor(engine:string) {
this.engine = engine
}
//function
disp():void {
console.log("Function displays Engine is : "+this.engine)
}
}
//create an object
var obj = new Car("XXSY1")
//access the field
console.log("Reading attribute value Engine as : "+obj.engine)
//access the function
obj.disp()
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var Car = (function () {
//constructor
function Car(engine) {
this.engine = engine;
}
//function
Car.prototype.disp = function () {
console.log("Function displays Engine is : " + this.engine);
};
return Car;
}());
//create an object
var obj = new Car("XXSY1");
//access the field
console.log("Reading attribute value Engine as : " + obj.engine);
//access the function
obj.disp();
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
Reading attribute value Engine as : XXSY1
Function displays Engine is : XXSY1
Sınıf Mirası
TypeScript, Miras kavramını destekler. Miras, bir programın mevcut bir sınıftan yeni sınıflar yaratma yeteneğidir. Daha yeni sınıflar oluşturmak için genişletilen sınıfa ana sınıf / süper sınıf denir. Yeni oluşturulan sınıflara alt / alt sınıflar denir.
Bir sınıf, 'extends' anahtar sözcüğünü kullanarak başka bir sınıftan miras alır. Alt sınıflar, ana sınıftan özel üyeler ve yapıcılar dışındaki tüm özellikleri ve yöntemleri devralır.
Sözdizimi
class child_class_name extends parent_class_name
Ancak TypeScript, çoklu mirası desteklemez.
Örnek: Sınıf Mirası
class Shape {
Area:number
constructor(a:number) {
this.Area = a
}
}
class Circle extends Shape {
disp():void {
console.log("Area of the circle: "+this.Area)
}
}
var obj = new Circle(223);
obj.disp()
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Shape = (function () {
function Shape(a) {
this.Area = a;
}
return Shape;
}());
var Circle = (function (_super) {
__extends(Circle, _super);
function Circle() {
_super.apply(this, arguments);
}
Circle.prototype.disp = function () {
console.log("Area of the circle: " + this.Area);
};
return Circle;
}(Shape));
var obj = new Circle(223);
obj.disp();
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
Area of the Circle: 223
Yukarıdaki örnek bir Shape sınıfı bildirir. Sınıf, Circle sınıfı tarafından genişletilir. Sınıflar arasında bir kalıtım ilişkisi olduğundan, çocuk sınıf, yani Car sınıfı, üst sınıf özniteliğine örtük bir erişim sağlar, yani alan.
Kalıtım şu şekilde sınıflandırılabilir -
Single - Her sınıf en fazla bir ebeveyn sınıfından genişletilebilir
Multiple- Bir sınıf, birden çok sınıftan miras alabilir. TypeScript çoklu kalıtımı desteklemez.
Multi-level - Aşağıdaki örnek, çok düzeyli kalıtımın nasıl çalıştığını gösterir.
Misal
class Root {
str:string;
}
class Child extends Root {}
class Leaf extends Child {} //indirectly inherits from Root by virtue of inheritance
var obj = new Leaf();
obj.str ="hello"
console.log(obj.str)
Leaf sınıfı, nitelikleri çok seviyeli miras yoluyla Kök ve Çocuk sınıflarından alır.
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Root = (function () {
function Root() {
}
return Root;
}());
var Child = (function (_super) {
__extends(Child, _super);
function Child() {
_super.apply(this, arguments);
}
return Child;
}(Root));
var Leaf = (function (_super) {
__extends(Leaf, _super);
function Leaf() {
_super.apply(this, arguments);
}
return Leaf;
}(Child));
var obj = new Leaf();
obj.str = "hello";
console.log(obj.str);
Çıktısı aşağıdaki gibidir -
Çıktı
hello
TypeScript ─ Sınıf mirası ve Yöntemi Geçersiz Kılma
Yöntemi Geçersiz Kılma, alt sınıfın üst sınıfın yöntemini yeniden tanımladığı bir mekanizmadır. Aşağıdaki örnek aynı şeyi göstermektedir -
class PrinterClass {
doPrint():void {
console.log("doPrint() from Parent called…")
}
}
class StringPrinter extends PrinterClass {
doPrint():void {
super.doPrint()
console.log("doPrint() is printing a string…")
}
}
var obj = new StringPrinter()
obj.doPrint()
Super anahtar sözcüğü, bir sınıfın hemen ebeveynine atıfta bulunmak için kullanılır. Anahtar kelime, bir değişkenin, özelliğin veya yöntemin süper sınıf versiyonuna atıfta bulunmak için kullanılabilir. 13. satır, doWork () işlevinin süper sınıf sürümünü çağırır.
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var PrinterClass = (function () {
function PrinterClass() {
}
PrinterClass.prototype.doPrint = function () {
console.log("doPrint() from Parent called…");
};
return PrinterClass;
}());
var StringPrinter = (function (_super) {
__extends(StringPrinter, _super);
function StringPrinter() {
_super.apply(this, arguments);
}
StringPrinter.prototype.doPrint = function () {
_super.prototype.doPrint.call(this);
console.log("doPrint() is printing a string…");
};
return StringPrinter;
}(PrinterClass));
var obj = new StringPrinter();
obj.doPrint();
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
doPrint() from Parent called…
doPrint() is printing a string…
Statik Anahtar Kelime
Statik anahtar kelime, bir sınıfın veri üyelerine uygulanabilir. Statik bir değişken, program yürütmeyi bitirene kadar değerlerini korur. Statik üyelere sınıf adıyla başvurulur.
Misal
class StaticMem {
static num:number;
static disp():void {
console.log("The value of num is"+ StaticMem.num)
}
}
StaticMem.num = 12 // initialize the static variable
StaticMem.disp() // invoke the static method
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var StaticMem = (function () {
function StaticMem() {
}
StaticMem.disp = function () {
console.log("The value of num is" + StaticMem.num);
};
return StaticMem;
}());
StaticMem.num = 12; // initialize the static variable
StaticMem.disp(); // invoke the static method
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
The value of num is 12
İnstanceof operatörü
instanceof nesne belirtilen türe aitse işleci true döndürür.
Misal
class Person{ }
var obj = new Person()
var isPerson = obj instanceof Person;
console.log(" obj is an instance of Person " + isPerson);
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var Person = (function () {
function Person() {
}
return Person;
}());
var obj = new Person();
var isPerson = obj instanceof Person;
console.log(" obj is an instance of Person " + isPerson);
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
obj is an instance of Person True
Veri Gizleme
Bir sınıf, kendi veri üyelerinin diğer sınıfların üyelerine görünürlüğünü kontrol edebilir. Bu özellik, Veri Gizleme veya Kapsülleme olarak adlandırılır.
Nesne Yönlendirme, Kapsülleme kavramını uygulamak için erişim değiştiricileri veya erişim belirleyicileri kavramını kullanır. Erişim belirleyicileri / değiştiricileri, bir sınıfın veri üyelerinin kendi tanımlayıcı sınıfının dışındaki görünürlüğünü tanımlar.
TypeScript tarafından desteklenen erişim değiştiriciler şunlardır:
S.No. | Erişim Tanımlayıcı ve Açıklama |
---|---|
1. | public Herkese açık bir veri üyesinin evrensel erişilebilirliği vardır. Bir sınıftaki veri üyeleri varsayılan olarak herkese açıktır. |
2. | private Özel veri üyelerine yalnızca bu üyeleri tanımlayan sınıf içinde erişilebilir. Harici bir sınıf üyesi özel bir üyeye erişmeye çalışırsa, derleyici bir hata atar. |
3. | protected Korunan bir veri üyesine, öncekiyle aynı sınıftaki üyeler ve ayrıca alt sınıfların üyeleri tarafından erişilebilir. |
Misal
Şimdi veri gizlemenin nasıl çalıştığını görmek için bir örnek alalım -
class Encapsulate {
str:string = "hello"
private str2:string = "world"
}
var obj = new Encapsulate()
console.log(obj.str) //accessible
console.log(obj.str2) //compilation Error as str2 is private
Sınıfın, sırasıyla genel ve özel üyeler olan str1 ve str2 olmak üzere iki dize özniteliği vardır. Sınıf somutlaştırılır. Örnek str2 özel özniteliğine onu bildiren sınıfın dışından erişildiği için bir derleme zamanı hatası döndürür.
Sınıflar ve Arayüzler
Sınıflar ayrıca arayüzler de uygulayabilir.
interface ILoan {
interest:number
}
class AgriLoan implements ILoan {
interest:number
rebate:number
constructor(interest:number,rebate:number) {
this.interest = interest
this.rebate = rebate
}
}
var obj = new AgriLoan(10,1)
console.log("Interest is : "+obj.interest+" Rebate is : "+obj.rebate )
AgriLoan sınıfı, kredi arayüzünü uygular. Bu nedenle, özelliği dahil etmek artık sınıf için bağlayıcıdır.interest üyesi olarak.
Derleme sırasında aşağıdaki JavaScript kodunu oluşturacaktır.
//Generated by typescript 1.8.10
var AgriLoan = (function () {
function AgriLoan(interest, rebate) {
this.interest = interest;
this.rebate = rebate;
}
return AgriLoan;
}());
var obj = new AgriLoan(10, 1);
console.log("Interest is : " + obj.interest + " Rebate is : " + obj.rebate);
Yukarıdaki kodun çıktısı aşağıdaki gibidir -
Interest is : 10 Rebate is : 1