Soyut bir sınıfın herhangi bir soyut yöntem olmadan tanımlanması


114

Soyut bir yöntem eklemeden soyut bir sınıf tanımlayabilir miyim?


1
Dekoratör modelinde iyi bir örnek bulunabilir, buraya bakın . Hem WindowDecoratorve CoffeeDecoratorvardır abstractsınıfları, fakat ikisi de bir içermektedir abstractyöntemi.
MS Dousti

Yanıtlar:


168

Elbette.

Bir sınıf özetini bildirmek, yalnızca onun kendi başına somutlaştırılmasına izin vermemeniz anlamına gelir.

Bir yöntem soyutunun bildirilmesi, alt sınıfların o yöntem için bir uygulama sağlaması gerektiği anlamına gelir.

İkisi ayrı kavramlardır, ancak tabii ki soyut olmayan bir sınıfta soyut bir yönteme sahip olamazsınız. finalYöntemlerle soyut sınıflara bile sahip olabilirsiniz, ancak bunun tersi asla olamaz.


14

Evet, bunu yapabilirsin. Neden bunu yapmayı denemiyorsun?


6
Ve bu sadece OP değil. Sorunun aldığı tüm olumlu oylara bir bakın!
Marc W

54
@ karim79 Yüksek atlara ve tüm o sos döken şeylere gerek yok. Bunu denemek, neden olduğunu sorarken neden izin verildiğini tam olarak açıklamıyor.
biziclop

7
@bizclop - Kendisi için denemek daha verimli bir soru ortaya çıkarabilirdi. Yüksek at yok. Bu oldukça basit. Sorusu, "Bunu neden yapar ..." yerine "yapabilir miyim?" İdi.
karim79

8
Soru basit bir evet veya hayır ile yanıtlanabiliyorsa, soruyu soran kişi yeniden ifade etmeyi, Google'ı kullanmayı veya sadece denemeyi düşünmelidir.
Tyler Treat

3
@ karim79 Evet, soru daha iyi ifade edilebilirdi ama sanırım bir adım ileriye bakmak o kadar da çaba gerektirmiyor.
biziclop

8

Evet yapabilirsin. Java'da kullanılan soyut sınıf, sınıfın bir nesnesini oluşturamayacağınızı belirtir. Ve alt sınıfların bu yöntem için bir uygulama sağlamaları gereken soyut bir yöntem.

Böylece soyut bir sınıfı herhangi bir soyut yöntem kullanmadan kolayca tanımlayabilirsiniz.

Ornek olarak :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Bu iyi.


6

EVET Herhangi bir soyut yöntem olmadan soyut sınıf oluşturabilirsiniz, soyut yöntem olmadan soyut sınıfın en iyi örneği HttpServlet'dir.
Soyut Yöntem gövdesi olmayan bir yöntemdir. soyut zorunludur ANCAK soyut sınıfı bildirdiyseniz, sınıf içinde soyut yöntemi bildirmek zorunlu değildir.

Soyut sınıf nesneleri yaratamazsınız, bu da onun somutlaştırılamayacağı anlamına gelir.


4

Evet, kendi başına gerçekleştiremeyeceğiniz bir sınıfı, yalnızca halihazırda uygulamaları olan yöntemlerle bildirebilirsiniz. Bu, ileride soyut yöntemler eklemek istiyorsanız veya sınıfın soyut özellikleri olmamasına rağmen doğrudan başlatılmasını istemiyorsanız yararlı olacaktır.


Soru boş soyut sınıflarla ilgili değildi, sadece soyut yöntemleri olmayan soyut sınıflar. Tamamen boş bir soyut sınıf kullanmak için görebildiğim kadarıyla geçerli bir neden yok.
biziclop

1
Cevap düzeltildi. Soyut yöntemleri daha sonra eklemek için iyi bir nedeniniz varsa ve diğer ana sınıfları yeniden düzenlemeyle uğraşmak zorunda kalmazsanız, boş bir soyut sınıf kullanmak yararlı olabilir.
Gordon Gustafson

1
Bir hiyerarşinin ortasında, tamamen boş bir soyut sınıf (kalıtım spesifikasyonu hariç), bu sınıfın türevlerinin, ebeveynin diğer türevlerinden farklı sözleşme yükümlülüklerine sahip olması durumunda anlamlı olabilir.
supercat

3

evet, herhangi bir soyut yöntem olmadan soyut bir sınıf ilan edebiliriz. Bir sınıfı soyut olarak bildirmenin amacı, sınıfı somutlaştırmak değildir.

yani iki durum

1) soyut yöntemlerle soyut sınıf.

bu tür sınıflar, bu soyut sınıftan bir sınıfı miras almalı ve sınıfımızdaki soyut yöntemleri geçersiz kılmalıyız, örn: GenricServlet sınıfı

2) soyut yöntemler içermeyen soyut sınıf.

Bu tür sınıflar için, bu soyut sınıftan bir sınıf miras almalıyız, örn: HttpServlet sınıfı yapmanın amacı, mantığınızı çocuk sınıfta uygulamazsanız ana mantığı elde edebilirsiniz.

lütfen HttpServlet kaynak kodunu kontrol edin


2

Evet, her ikisi de bağımsız kavramlar olduğu için Soyut Yöntemler olmadan soyut bir sınıfa sahip olabiliriz. Bir sınıf soyut bildirmek, kendi başına somutlaştırılamayacağı ve yalnızca alt sınıflara ayrılabileceği anlamına gelir. Bir yöntem özetinin bildirilmesi, Yöntemin alt sınıfta tanımlanacağı anlamına gelir.


Neden sınıfın somutlaştırılamamasını istemem? İyi bir neden var mı, örneğin?
karlihnos

1

evet bunu yapabilirsin.

sınıf soyutunu bildirmek, sınıfın başka herhangi bir sınıf tarafından somutlaştırılmayacağı anlamına gelir.

ve bunun içinde en az bir soyut yöntem bulunmalıdır ve bunun anlamı, eğer yöntemi tamamından bildirmiyorsanız, bu sınıfta soyut yöntem bildirebilirsiniz.

misal:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

bu kesinlikle işe yarayacak.


1

Evet yapabilirsin. Bazen, bunu yapmanın amacının ne olduğu sorusu size sorulabilir. Cevap şudur: Bazen sınıfın kendi başına somutlaştırılmasını kısıtlamamız gerekir. Bu durumda, kullanıcının Abstract sınıfımızı genişletmesini ve alt sınıfı başlatmasını istiyoruz.


1

Evet, soyut bir yöntem olmadan soyut bir sınıf tanımlayabilirsiniz. Ancak, içinde hiçbir yöntem yoksa, bir arayüzle gitmeniz daha iyi olabilir.


4
Minimum 30 karakter sınırını aşmak için iyi bir fikir.
Marc W

1
Soyut bir yöntem yoksa bir arayüz nasıl kullanılabilir? Arayüz varsayılan olarak tüm yöntemlere sahiptir.
Usman Rana

1

Yapabilirsin, aklımdaki soru daha fazla sormalıyım. En başından beri sert ve hızlı bir cevap olmadığını söyleyeceğim. Mevcut durumunuz için doğru olanı yapın.

Bana göre miras, bir 'bir' ilişkisidir. Daha özelleşmiş alt türler (Alsas, Kaniş, vb.) İle genişletilebilecek bir köpek sınıfı hayal edin. Bu durumda, köpek sınıfını soyutlamak, alt türler köpekler olduğu için yapılacak doğru şey olabilir. Şimdi köpeklerin bir tasmaya ihtiyacı olduğunu hayal edelim. Bu durumda kalıtım bir anlam ifade etmiyor: Köpekler ve tasmalar arasında 'bir' ilişkisinin olması saçmalıktır. Bu kesinlikle bir 'var' ilişkisi, yaka işbirliği yapılan bir nesnedir. Sadece köpeklerin sahip olabilmesi için tasmayı soyutlamak mantıklı değil.

Sıklıkla soyut metotları olmayan soyut sınıfların gerçekten bir 'has-a' ilişkisini ifade ettiğini görüyorum. Bu durumlarda, genellikle kalıtım kullanılmadan kodun daha iyi faktörlendirilebileceğini görüyorum. Ayrıca, soyut yöntemi olmayan soyut sınıfların genellikle bir kod kokusu olduğunu ve en azından bir kod incelemesinde sorulan sorulara yol açması gerektiğini gördüm.

Yine, bu tamamen özneldir. Soyut metotları olmayan soyut bir sınıfın anlamlı olduğu durumlar olabilir, bu tamamen yoruma ve gerekçelendirmeye bağlıdır. Üzerinde çalıştığınız şey için en iyi kararı verin.


1

Gerçekte, soyut bir sınıfın herhangi bir soyut metodu yoksa hiçbir anlamı yoktur. Soyut bir sınıf, bir baba gibidir. Bu babanın bazı özellikleri ve davranışları var, çocukken babanın çocuğu olmak istediğinizde, baba çocuğa (siz) böyle olmalı diyor, bu bizim MOTO'muz ve yapmak istemiyorsan sen benim çocuğum değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.