Neden't yapılar kalıtım desteklemez?
Bu yapılar biliyorum .NET miras, ancak onun değil tam olarak net bir destek yoknedenbu şekilde sınırlıdır.
Ne teknik nedeni, diğer yapılar devralmasını gelen yapılar engeller?
CEVAP
Değer türleri devralma destek sebebinin diziler yüzünden.
Sorun, performans ve GC nedenlerle, değer türleri, dizi depolanan"". satır içi Örneğin, eğer FooType
başvuru ise, 11 new FooType[10] {...}
, verilen nesneleri yönetilen yığın (dizi, ve her tür örneğin 10) oluşturulacak. FooType
yerine bir değer türü, yalnızca bir örneği oluşturulur üzerinde yönetilen yığın ... dizinin kendisi (her dizi değeri olacak saklı "satır içi" dizisi).
Şimdi, değer türleri ile miras vardı sanırım. "Satır içi depolama" diziler davranış, Kötü Şeyler görülebilir in C gibi her şey. yukarıdaki ile birlikte
Bu sözde düşünün C# kod:
struct Base
{
public int A;
}
struct Derived : Base
{
public int B;
}
void Square(Base[] values)
{
for (int i = 0; i < values.Length; i)
values [i].A *= 2;
}
Derived[] v = new Derived[2];
Square (v);
Normal dönüşüm kuralları, Derived[]
Cabrio Base[]
(iyi yada kötü) bir s/yapı/sınıf/g yukarıdaki örnek olacak derlemek ve çalıştırmak beklendiği gibi, bir sorun yok. Ama Base
Derived
değer türleri vardır, ve mağaza içi değerleri diziler, o zaman bir sorunumuz var.
Bir sorunumuz var, çünkü Square()
haberi yok Derived
bunu kullanmak sadece işaretçi aritmetiği erişim her elemanın dizi, artan bir sabit tutar (sizeof(A)
). Kurul belli belirsiz gibi olacaktır:
for (int i = 0; i < values.Length; i)
{
A* value = (A*) (((char*) values) i * sizeof(A));
value->A *= 2;
}
(Evet, iğrenç bir montaj ama noktadan-derleme zamanı sabitleri, türetilmiş bir tür kullanılan herhangi bir bilgi olmadan da biliniyor dizisi artış olur.)
Eğer bu gerçekten olduysa, bellek bozulması sorunları olurdu. Özellikle, Square()
, values[1].A*=2
içinde . ben^>aslındavalues[0].B
değiştirme!
Hata ayıklamak için deneyinBU!
Neden değişken yapılar“”? kötü...
Neden't Java imzasız değer vermez...
Neden'Objective-C t özel yöntemle...
Neden't JavaScript çoklu kullanım...
Neden't Jenerik Java ilkel türler...