Eğer geçersiz kılan kavramlarımız varsa neden soyutlamalısınız?

Geçersiz kılma kavramına sahipsek neden soyut sınıfa geçmeliyiz? Her neyse, soyut yöntemi tanımlamak için soyut sınıfı genişletmeliyiz, soyut yöntemini basitçe genişletip geçersiz kılabiliriz, o zaman soyut yapmanın mantığı nedir?

0
Sınıf ve Arabirimin piç çocuğu, kendine özgü bir amacı olmayan, ancak hem sınıf hem de arayüzün ihtiyaçlarını karşılayabilecek bir çocuk. Programmers.SE 'de iyi cevaplar
katma yazar Ceiling Gecko, kaynak

8 cevap

Soyut yöntemler bir uygulamaya sahip olamaz, bu nedenle soyut bir sınıfta sadece (somut) bir alt sınıfta geçersiz kılmak için bir uygulama sağlayacağınız durum bu değildir.

Soyut bir yöntemin amacı, tüm alt sınıflarının sahip olacağı ortak bir davranış tanımlamaktır. Ancak, bu davranış soyut sınıf düzeyinde bilinmemektedir. Önemsiz bir örnek vermek gerekirse:

abstract public class Animal {
    public abstract void eat();
}

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("I eat dog biscuits");
    }
}

Burada, tüm Hayvan 'ları yer, ancak belirli bir alt sınıf oluşturacak olana kadar ne yediklerini bilmiyoruz. Soyut bir yöntem bu sorun için çok uygundur.

2
katma
Evet .... "Vay!"
katma yazar Tim Biegeleisen, kaynak
ne tesadüf...
katma yazar wings, kaynak

Diyelim ki çok farklı türden araçlar yapacaksınız: aile arabaları, spor arabaları, F1 arabaları ...

Tüm bunlar için, accelerate() yöntemi çok farklı bir uygulamaya sahip olacaktır. Diyelim ki Araba'yı soyut bir sınıf yapmaz ve hızlanmanın uygulanmasını sağlar.

Birisi bir F1 arabası yapacak olsaydı, şunu düşünebilirdi: Zaten hızlanacak bir işleve sahibiz, kullanmamak için hiçbir neden yok. Sonunda, tüm araba türleriyle aynı şekilde hızlandırabiliriz.

Bu, ya çok yavaş F1 yarışlarına ya da Flash'ın bile bir yaya olmasını istemediği temel trafiğe yol açacaktı.

Soyut sınıf, 'ne' yapılması gerektiğini, 'nasıl' yapılması gerektiğini söylememek, aynı zamanda arabirimlerden farklı olarak soyut olmayan yöntemler ekleme olanağına da sahiptir.

2
katma

sınıf hayvanı:

public abstract class Animal{
    protected abstract void makeNoise();
}

Köpek:

class Dog extends Animal{
    protected void makeNoise(){
        print("woof");
    }
}

Kedi:

class Cat extends Animal{
    protected void makeNoise(){
        print("meow");
    }
}

biraz gürültü istediğimde:

private Animal animal; //could be a (cute) dog or a cat or something else.
public void makeNoise(){
    this.animal.makeNoise();
}

Bir kelimeyle, soyut sınıf sizin dediğiniz gibi tanımları verir. Ve özellikle ayrıntıları bilmeden belirli bir mantık uygulamak istediğimde tanım önemli olabilir.

1
katma

Özet yapmanın nedeni, genişletilmiş davranış olmadan (alt sınıflar tarafından uygulanır) tamamlanmadığından, bu belirli sınıftan örnekler yaratmayacağınızdır.

Alt sınıfları için ortak bir davranış sağlar, böylece her bir alt sınıf için bu ortak davranışı yazmak zorunda kalmazsınız

0
katma

Soyut sınıf somutlaştırılamaz. Bir sınıf özeti yaparak, kullanıcıları için yalnızca uzantı için tasarlandığını açıkça belirtirsiniz.

0
katma

Ne zaman bir sınıfınızın örneğine izin vermek istemiyorsanız, onu soyut sınıf haline getirmeniz gerekir.

Ayrıca, soyut sınıf, tüm alt sınıfları için ortak mantık olan bazı yöntemleri içerebilir.

Umarım yardımcı olur.

Şerefe.

0
katma

Kimsenin onu incitmeyeceğinden emin olmak için soyut bir sınıf yaratıyorsun. Soyut sınıf ana mantığa sahip olabilir, ancak yine de soyut yöntemlerle sağlanması gereken daha fazla bilgiye ihtiyaç duyuyor.

0
katma

Soyut bir Shape2D sınıfınız olduğunu varsayalım. Bilirsin, böyle bir şey çizebilirsin, ama tam olarak HOW? Shape2D için yöntem draw() tanımlayamazsınız. Bu yöntem yalnızca Shape2D olan nesnelerin çizilebileceği bir kavramdır.

0
katma