Alt sınıflar özel alanları miras alır?


245

Bu bir röportaj sorusu.

Alt sınıflar özel alanları miras alır?

"Hayır" cevabını verdim, çünkü onlara "normal OOP yolunu" kullanarak erişemiyoruz. Ancak görüşmeci kalıtsal olduğunu düşünür, çünkü bu tür alanlara dolaylı olarak veya yansıma kullanarak erişebiliriz ve hala nesnede var olurlar.

Geri döndükten sonra, javadoc'ta şu alıntıyı buldum :

Süper Sınıfta Özel Üyeler

Alt sınıf, üst sınıfının özel üyelerini devralmaz.

Görüşmecinin görüşü için herhangi bir argüman biliyor musunuz?


33
Bir zamanlar benzer bir durumdaydım ve görüşmecinin Java hakkında benden daha az şey bildiği bir şirkette çalışmak bile istemediğimi fark ettim. :)
biziclop

48
Bir görüşmeci bazen haklı olduğunuzu bilse bile size katılmayacaktır. İyi bir görüşmeci sizinle ilgili teknik bilginizden daha fazlasını öğrenmeye çalışacaktır.
Andy Thomas

4
@DigitalRoss Java Dil Belirtimi de kötü yazılmış mı? RD01 yanıtına bakın: stackoverflow.com/questions/4716040/…
OscarRyz

9
@Andy Thomas-Cramer Tepkimi test etmek için kasten yalan söyleyen insanlarla çalışmak istemezdim.
biziclop

4
Sanırım önce Java'daki "kalıtım" ın anlamını anlamalıyız. Alt sınıf özel alana sahip değildir ve alt sınıf özel alana sahiptir, ancak alt alana erişilemez, hangisi Java'daki kalıtımın tam anlamını ifade eder?
MengT

Yanıtlar:


238

Buradaki soru / cevaplardaki karışıklığın çoğu Kalıtım tanımını çevrelemektedir.

@DigitalRoss'un açıkladığı gibi , bir alt sınıfın NESNE üst sınıfının özel alanlarını içermelidir. Belirttiği gibi, özel bir üyeye erişimin olmaması onun orada olmadığı anlamına gelmez.

Ancak. Bu, bir sınıf için miras kavramından farklıdır. Anlambilim sorunu olan java dünyasında olduğu gibi hakem Java Dil Spesifikasyonu'dur (şu anda 3. baskı).

JLS'in belirttiği gibi ( https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2 ):

Özel olarak bildirilen bir sınıfın üyeleri, o sınıfın alt sınıfları tarafından miras alınmaz. Yalnızca korunan veya herkese açık olarak bildirilen bir sınıfın üyeleri, sınıfın bildirildiği sınıf dışındaki bir pakette bildirilen alt sınıflar tarafından devralınır.

Bu, görüşmeci tarafından yöneltilen soruyu tam olarak ele alır: "alt SINIFLER özel alanları miras alsın ". (vurgu eklediğim)

Cevap hayır. Hayır. Alt sınıfların HEDEFLERİ, üst sınıflarının özel alanlarını içerir. Alt sınıfın kendisi, üst sınıfının özel alanlarına ilişkin YOKTUR.

Bilgiçlik taslayan doğanın anlambilimi midir? Evet. Yararlı bir röportaj sorusu mu? Muhtemelen değil. Ancak JLS, Java dünyasının tanımını belirler ve bunu (bu durumda) açık bir şekilde yapar.

EDITED (Java ve c ++ arasındaki farklar nedeniyle muhtemelen karışıklığa katkıda bulunan Bjarne Stroustrup'tan paralel bir alıntı kaldırıldı. Cevabımın JLS'de dinlenmesine izin vereceğim :)


3
@digital neden iç çekti. Haklı olduğuna inandığını anlıyorum. Sizinle, çoğu programcının öğrettiği / düşündüğü nesne mirası olduğuna katılmıyorum. Ancak JLS tanımı doğrudan orijinal soru için geçerlidir. Anlambilim evet, ama JLS tanımı siz veya ben değil belirler.
robert_x44

4
Tüm bunları uzlaştırmanın bir yolu , en azından Java dünyasında türetilmiş ve ana sınıfların ilişkisini tanımlamak için "miras" sözcüğünün iki farklı şekilde kullanıldığını tanımaktır . Evet, JSL yetkili. Evet, "miras" ı talihsiz bir şekilde kullanabileceğiniz anlamına gelir. Ama yine de alt sınıfların üst sınıflarının özel alanlarını kurbağaladıkları açıkça görülmektedir.
DigitalRoss

1
@digital Sınıfın nesnesindeler. sınıfın kendisi değil. Simula onlara birleştirilmiş nesneler dedi. Bir alt sınıfın nesnesi oluşturulduğunda, birleştirilmiş 'önek nesnelerinden' oluşur. Üst sınıf nesne, diğer önek nesnelerini içerebilen bir önek nesnesiydi. Bence JLS'nin "açıkça kötü ifadelere" sahip olduğunu söylemek kibirdir. Hangi kelimeyi kullanırsak, kalıtım elbette. Biraz belirsiz terminoloji kullanmakta yanlış bir şey yoktur. Bu her zaman olur. Ancak bu kesin bir tanım olmadığı anlamına gelmez.
robert_x44

1
@digital Kelimenin farklı şekillerde kullanıldığını kesinlikle kabul edebiliriz. :) Ayrıca, belirsiz bir terime dayanan bir röportaj sorusunun muhtemelen iyi bir soru olmadığı konusunda da anlaşabiliriz.
robert_x44

2
Herkes Java / Oracle'dan "Alt sınıf nesneleri kendi üst sınıflarının özel alanlarını içerir" için bir referans var mı? Buna katılıyorum, ancak bunu söyleyen resmi belge bulamıyorum.
MengT

78

Evet

Orada iken fark etmek önemlidir olan iki sınıfları, yalnızca bir nesne vardır.

Yani, evet, elbette özel alanları miras aldı. Muhtemelen, uygun nesne işlevselliği için gereklidir ve üst sınıfın bir nesnesi türetilmiş sınıfın bir nesnesi olmasa da, türetilmiş sınıfın bir örneği kesinlikle üst sınıfın bir örneğidir. Tüm alanlar olmasa çok iyi olamazdı.

Hayır, onlara doğrudan erişemezsiniz. Evet, kalıtsaldırlar. Onlar sahip olmak.

Güzel bir soru!


Güncelleme:

Hata, "Hayır"

Sanırım hepimiz bir şeyler öğrendik. Yana JLS kesin kökenli ifade, cevap doğrudur "miras değil" "hayır" . Alt sınıf özel alanlara erişemediğinden veya değiştiremediğinden, başka bir deyişle, devralınmazlar. Ama gerçekten orada olduğunu sadece bir nesne gerçekten, içermiyor özel alanlar, birileri jls ve öğretici ifadeler yanlış şekilde alır, bu durumda onu cepten anlamak, Java nesneleri ve gerçekten neler olup bittiğini oldukça zor olacaktır.

Güncellenecek güncelleme:

Buradaki tartışma temel bir belirsizlik içeriyor: tam olarak ne tartışılıyor? Nesne? Yoksa bir anlamda sınıfın kendisi hakkında mı konuşuyoruz ? Sınıfı nesneye zıt olarak tanımlarken çok fazla enine izin verilir. Alt sınıf değil devralır özel alanları yok, ama Yani alt sınıfının bir örneğidir bir nesne kesinlikle öyle ihtiva özel alanlar.


2
@ Ma99uS. Tabii ki tekrar kullanılıyorlar. Bütün kalıtım noktası budur. Bunlar olmadan türetilmiş tür, üst türün bir örneği olamaz ve olamaz. OOP anlamsız olurdu. Polimorfik tipler çalışmayı durduracaktır . Yalnızca tek bir nesne olduğunu ve ana tipin bir OLDUĞUNU anlamak OOP'u anlamak için çok önemlidir. Bunu anlamak için bu sorunu aşmanız gerekir.
DigitalRoss

2
Baba örneğinin çok iyi olduğundan emin değilim çünkü ana sınıf hala yaşarken ve aynı zamanda bu alana sahipken bir alan miras alınabilir. Miras bu şekilde çalışırsa, babam hayatta iken parasını devralabilirdim ve aynı parayı da tutabilirdi. Çocuklarımın her birinin parası ve paramı olurdu.
Peter Lawrey

2
@Peter Lawrey tartışmıyor falan değil, işte burada bence. Ebeveynin bir çocuğu vardı, çocuğun anahtarı olmayan carbir privatedolapta tuttu . Gerçekten miras alıyorsunuz carama bu sizin için işe yaramaz. Yani, pratik olarak, mirastan faydalanmıyorsunuz.
Nishant

1
@DigitalRoss. Ne demek istediğimi anladım. Mhh, kalıtsal olmayan üst tanımın da yüklü olması nedeniyle değerin orada olduğunu söyleyebiliriz . :) JVM spec aradığımız bu "NO WORD" için doğru cevaba sahip olacağını düşünüyorum . java.sun.com/docs/books/jvms
OscarRyz

5
-1, Java Dil Belirtimi miras alınmadıklarını açıkça belirtir. Hayır ifs, hayır buts. Onlar basitçe değil. Java bağlamında başka herhangi bir kalıtım tanımı yanlıştır.
biziclop

21

Hayır. Özel alanlar miras alınmaz ... ve bu yüzden Korumalı icat edildi. Tasarım gereğidir. Sanırım bu, korumalı değiştiricinin varlığını haklı çıkardı.


Şimdi bağlamlara geliyor. Devralınarak ne demek - türetilmiş sınıftan yaratılmış nesnede varsa? Evet öyle.

Eğer demek istiyorsan türetilmiş sınıf için yararlı olabilir. Hayır.

Şimdi, fonksiyonel programlamaya geldiğinizde , süper sınıfın özel alanı alt sınıf için anlamlı bir şekilde miras alınmaz . Alt sınıf için, süper sınıfın özel alanı, diğer sınıfların özel alanı ile aynıdır.

İşlevsel olarak, kalıtsal değildir. Ama ideal olarak , öyle.


Tamam, sadece bu alıntı alıntı Java öğretici baktı:

Süper Sınıfta Özel Üyeler

Alt sınıf, üst sınıfının özel üyelerini devralmaz. Ancak, üst sınıf, özel alanlarına erişmek için ortak veya korumalı yöntemlere sahipse, bunlar alt sınıf tarafından da kullanılabilir.

bakın: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html

Alanın orada olduğuna katılıyorum. Ancak, alt sınıf bu özel alanda herhangi bir ayrıcalık elde etmez. Bir alt sınıfa göre, özel alan diğer herhangi bir sınıfın özel alanıyla aynıdır.

Bunun sadece bir bakış açısı meselesi olduğuna inanıyorum. Argümanı her iki tarafta da şekillendirebilirsiniz. Her iki yolu da haklı çıkarmak daha iyi.

 


2
Bu doğru değil. Onlara erişemezsiniz, bu doğru. Ama var önce de açıkladığım gibi devralınacak.
DigitalRoss

1
mükemmel cevap !!! 1 için I believe it's purely matter of point-of-view.vejustified the existence of protected modifier.
Ravi

14

Bu, "miras" tanımınıza bağlıdır. Alt sınıfın hala bellekteki alanları var mı? Kesinlikle. Onlara doğrudan erişebilir mi? Hayır. Sadece tanımın incelikleri; asıl mesele gerçekte ne olduğunu anlamak.


Doğru. Ama bence bu temel soruda ortak cevaplar olmalı)
Stan Kurilin

Bence bu Java'nın miras tanımıdır.
OscarRyz

Ya da "alan" tanımınıza bağlıdır. Bir tamsayı alanı tanımlamak için "foo", bir tamsayı boyutunda depolama dolabı kiralamak ve üzerine bir "foo" işareti koymaktır. Alan özel olarak bildirilirse, türetilmiş sınıf etiketlenmemiş bir tamsayı boyutlu depolama dolabını devralır. Türetilmiş sınıfın "alanı" miras alıp almayacağı, etiketlenmemiş depolama dolabını "alan" olarak adlandırıp çağırmayacağına bağlıdır.
supercat

10

Kavramı kodla göstereceğim. Alt sınıflar GERÇEKTEN süper sınıfın özel değişkenlerini devralır . Tek sorun erişilebilir olmamaları süper sınıftaki özel değişkenler için genel alıcılar ve ayarlayıcılar sağlamadığınız sürece alt nesneler tarafından .

Dump paketinde iki sınıf düşünün. Çocuk Ebeveyn uzatır.

Doğru hatırlarsam, bellekteki bir alt nesne iki bölgeden oluşur. Biri sadece üst kısım, diğeri sadece alt kısımdır. Çocuk, üst öğesinin kodundaki özel bölüme yalnızca üst öğedeki genel bir yöntemle erişebilir.

Bu şekilde düşün. Borat'ın babası Boltok'un 100.000 dolarlık bir kasası var. "Özel" değişkenini güvenli bir şekilde paylaşmak istemiyor. Yani kasa için bir anahtar sağlamaz. Borat kasayı miras alır. Ancak, açamasa bile ne iyi olur? Sadece babası anahtarı vermiş olsaydı.

Üst -

package Dump;

public class Parent {

    private String reallyHidden;
    private String notReallyHidden;

    public String getNotReallyHidden() {
        return notReallyHidden;
    }

    public void setNotReallyHidden(String notReallyHidden) {
        this.notReallyHidden = notReallyHidden;
    }

}//Parent

Çocuk -

package Dump;

public class Child extends Parent {

    private String childOnly;

    public String getChildOnly() {
        return childOnly;
    }

    public void setChildOnly(String childOnly) {
        this.childOnly = childOnly;
    }

    public static void main(String [] args){

        System.out.println("Testing...");
        Child c1 = new Child();
        c1.setChildOnly("childOnly");
        c1.setNotReallyHidden("notReallyHidden");

        //Attempting to access parent's reallyHidden
            c1.reallyHidden;//Does not even compile

    }//main

}//Child

10

Hayır. Miras almıyorlar.

Başka bir sınıfın onu dolaylı olarak kullanabilmesi, kalıtım hakkında değil, kapsülleme hakkında hiçbir şey söylemez.

Örneğin:

class Some { 
   private int count; 
   public void increment() { 
      count++;
   }
   public String toString() { 
       return Integer.toString( count );
   }
}

class UseIt { 
    void useIt() { 
        Some s = new Some();
        s.increment();
        s.increment();
        s.increment();
        int v = Integer.parseInt( s.toString() );
        // hey, can you say you inherit it?
     }
}

Yansıtma yoluyla countiçerideki değeri de elde edebilirsiniz UseIt. Bu, kalıtımsal olduğunuz anlamına gelmez.

GÜNCELLEME

Değer orada olmasına rağmen, alt sınıf tarafından miras alınmaz.

Örneğin, şu şekilde tanımlanan bir alt sınıf:

class SomeOther extends Some { 
    private int count = 1000;
    @Override
    public void increment() { 
        super.increment();
        count *= 10000;
    }
}

class UseIt { 
    public static void main( String ... args ) { 
        s = new SomeOther();
        s.increment();
        s.increment();
        s.increment();
        v = Integer.parseInt( s.toString() );
        // what is the value of v?           
     }
}

Bu, ilk örnekle tamamen aynı durumdur. Özellik countgizlidir, değil alt sınıf tarafından miras alınmaz. Yine de, DigitalRoss'un belirttiği gibi, değer oradadır, ancak miras yoluyla değil.

Bu tarafa koy. Babanız zenginse ve size kredi kartı veriyorsa, hala parasıyla bir şeyler satın alabilirsiniz, ancak miras aldığınız anlamına gelmez tüm bu parayı , değil mi?

Diğer güncelleme

Yine de çok ilginç, bu özelliğin neden orada olduğunu bilmek .

Açıkçası bunu tanımlamak için kesin bir terime sahip değilim, ama JVM ve aynı zamanda "kalıtsal olmayan" üst tanımını da yükleyen çalışma şekli.

Ebeveyni gerçekten değiştirebiliriz ve alt sınıf yine de çalışır.

Örneğin :

//A.java
class A {
   private int i;
   public String toString() { return ""+ i; }
}
// B.java
class B extends A {}
// Main.java
class Main {
   public static void main( String [] args ) {
      System.out.println( new B().toString() );
    }
}
// Compile all the files
javac A.java B.java Main.java
// Run Main
java Main
// Outout is 0 as expected as B is using the A 'toString' definition
0

// Change A.java
class A {
   public String toString() {
      return "Nothing here";
   }
}
// Recompile ONLY A.java
javac A.java
java Main
// B wasn't modified and yet it shows a different behaviour, this is not due to 
// inheritance but the way Java loads the class
Output: Nothing here

Sanırım tam terim burada bulunabilir: JavaTM Sanal Makine Özellikleri


:) Bir dahaki sefere mülakatçınızı nerede yanlış olduğunu açıklama şansına sahip olabilirsiniz ve bu size fazladan puan verebilir;) Açıkçası bunu diplomatik bir şekilde yapmalısınız.
OscarRyz

1
Onlar sahip polimorfik türleri hiç bir anlamı var için devralınacak. Açıklamama bakın. Onlarla oynayamayacağınız doğru, ama oradalar. Onlar sahip olmak.
DigitalRoss

Kodunuzda kalıtım (genişletir / uygular) anahtar kelimeler yoktur, bu nedenle bu bir kalıtım örneği değildir.
fmucar

1
Uhh, eğer oradalarlarsa, oraya nasıl ulaştılar? Çünkü alt sınıf onları tanımladı mı? Hayýr. Çünkü onlar, uhh, hmm, err, miras ?
DigitalRoss

1
encapsulationVs vs büyük nokta, inheritsanırım bu cevap daha fazla oy hak.
Eric Wang

6

Görüşmeci sorusuna cevabım şudur: Özel üyeler alt sınıflarda kalıtsal değildir, ancak alt sınıf veya alt sınıfın nesnesine yalnızca kamu alıcısı veya ayarlayıcı yöntemleri veya orijinal sınıfın herhangi bir uygun yöntemi ile erişilebilirler. Normal uygulama, üyeleri özel tutmak ve herkese açık olan alıcı ve ayarlayıcı yöntemlerini kullanarak erişmektir. Öyleyse, yalnızca ele aldıkları özel üye nesne için mevcut olmadığında, alıcı ve ayarlayıcı yöntemlerini devralmanın anlamı nedir? Burada 'miras alınan', basitçe alt sınıfta yeni tanıtılan yöntemlerle oynamanın doğrudan alt sınıfta mevcut olduğu anlamına gelir.

Aşağıdaki dosyayı ParentClass.java kaydedin ve kendiniz deneyin ->

public class ParentClass {
  private int x;

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }
}

class SubClass extends ParentClass {
  private int y;

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public void setXofParent(int x) {
    setX(x); 
  }
}

class Main {
  public static void main(String[] args) {
    SubClass s = new SubClass();
    s.setX(10);
    s.setY(12);
    System.out.println("X is :"+s.getX());
    System.out.println("Y is :"+s.getY());
    s.setXofParent(13);
    System.out.println("Now X is :"+s.getX());
  }
}

Output:
X is :10
Y is :12
Now X is :13

SubClass'ın yönteminde ParentClass özel değişkeni x'i kullanmaya çalışırsak, herhangi bir değişiklik için doğrudan erişilemez (devralınmayan anlamına gelir). Ancak x, setXofParent () yönteminde yapıldığı gibi orijinal sınıfın setX () yöntemi ile SubClass'ta değiştirilebilir VEYA setX () yöntemi veya nihayetinde setX () öğesini çağıran setXofParent () yöntemi kullanılarak ChildClass nesnesi kullanılarak değiştirilebilir. Yani burada setX () ve getX (), bir ParentClass'ın özel üyesine (x) açılan kapılardır.

Diğer bir basit örnek ise Clock superclass'ın özel üye olarak saat ve dakika ve genel olarak uygun alıcı ve ayarlayıcı yöntemlere sahip olmasıdır. Ardından Clock'un alt sınıfı olarak DigitalClock gelir. Burada DigitalClock nesnesi saat ve dakika üyeleri içermiyorsa işler bozulur.


2
Oracle doc uyarınca - Bir alt sınıf, üst sınıfının özel üyelerini devralmaz. Ancak, üst sınıf, özel alanlarına erişmek için ortak veya korumalı yöntemlere sahipse, bunlar alt sınıf tarafından da kullanılabilir.
dganesh2002

4

Tamam, bu çok ilginç bir problem, çok araştırdım ve bir üst sınıfın özel üyelerinin alt sınıfın nesnelerinde gerçekten mevcut (ancak erişilebilir değil) olduğu sonucuna vardım. Bunu kanıtlamak için, burada bir üst sınıf ve bir alt sınıf içeren bir örnek kod var ve alt sınıf nesnesini bir txt dosyasına yazıyorum ve dosyada 'bhavesh' adlı özel bir üyeyi okuyorum, bu nedenle gerçekten çocukta kullanılabilir olduğunu kanıtlıyorum sınıf, ancak erişim değiştirici nedeniyle erişilemiyor.

import java.io.Serializable;
public class ParentClass implements Serializable {
public ParentClass() {

}

public int a=32131,b,c;

private int bhavesh=5555,rr,weq,refw;
}

import java.io.*;
import java.io.Serializable;
public class ChildClass extends ParentClass{
public ChildClass() {
super();
}

public static void main(String[] args) {
ChildClass childObj = new ChildClass();
ObjectOutputStream oos;
try {
        oos = new ObjectOutputStream(new FileOutputStream("C:\\MyData1.txt"));
        oos.writeObject(childObj); //Writing child class object and not parent class object
        System.out.println("Writing complete !");
    } catch (IOException e) {
    }


}
}

MyData1.txt dosyasını açın ve 'bhavesh' adlı özel üyeyi arayın. Lütfen ne düşündüğünüzü bana bildirin.


3

Bir alt sınıfın, özel alanların miras aldığı, bu alanların alt sınıfın iç işleyişinde (felsefi olarak konuşulduğu) miras aldığı görülmektedir. Bir alt sınıf, yapıcısında üst sınıf yapıcısını çağırır. Üst sınıf yapıcısı bu alanları yapıcısında başlattıysa, üst sınıf özel alanları, üst sınıf yapıcısını çağıran alt sınıf tarafından açıkça miras alınır. Bu sadece bir örnek. Ancak elbette, erişimci yöntemleri olmadan alt sınıf, üst sınıf özel alanlara erişemez (telefonu sıfırlamak için pili çıkarmak için bir iPhone'un arka panelini açamamak gibi ... ancak pil hala orada).

PS Karşılaştığım birçok miras tanımından biri: "Miras - türetilmiş bir sınıfın temel sınıfın işlevselliğini genişletmesine olanak tanıyan, tüm STATE (vurgu benimdir) ve davranışını miras alan bir programlama tekniği."

Özel alanlar, alt sınıf tarafından erişilemese bile, üst sınıfın miras alınan durumudur.


1

Java özel alanlar buna cevap vermek zorunda kalacak olan miras. Göstermeme izin ver:

public class Foo {

    private int x; // This is the private field.

    public Foo() {
        x = 0; // Sets int x to 0.
    }

    //The following methods are declared "final" so that they can't be overridden.
    public final void update() { x++; } // Increments x by 1.
    public final int getX() { return x; } // Returns the x value.

}


public class Bar extends Foo {

    public Bar() {

        super(); // Because this extends a class with a constructor, it is required to run before anything else.

        update(); //Runs the inherited update() method twice
        update();
        System.out.println(getX()); // Prints the inherited "x" int.

    }

}

Bir programda çalıştırırsanız Bar bar = new Bar();, çıkış kutusunda her zaman "2" sayısını görürsünüz. Tam sayı, "x" yöntemlerle kapsüllenmiş olduğu için update()ve getX(), o zaman tam sayı kalıtımsal olduğu ispat edilebilir.

Karışıklık şu ki, "x" tamsayısına doğrudan erişemediğiniz için, insanlar bunun miras alınmadığını iddia ediyorlar. Ancak, ister sınıf ister alan olsun, statik olmayan her şey miras alınır.


3
"İçerir", "miras" anlamına gelmez;)
Stan Kurilin

1

Java vis-a-vis mirasında Bellek Düzeni

resim açıklamasını buraya girin

Dolgu bitleri / Hizalama ve Nesne Sınıfının VTABLE'a dahil edilmesi dikkate alınmaz. Bu nedenle, alt sınıfın nesnesinin Süper sınıfın özel üyeleri için bir yeri vardır. Ancak, alt sınıfın nesnelerinden erişilemez ...


1

Hayır , özel alanlar miras alınmaz. Bunun tek nedeni, alt sınıfın bunlara doğrudan erişememesidir .


0

İnanıyorum ki, cevap tamamen sorulan soruya bağlıdır. Yani, soru şuysa

Süper sınıfın özel alanına alt sınıflarından doğrudan erişebilir miyiz ?

O zaman cevap Hayır , eğer erişim belirleyici detaylarından geçersek, özel üyelere sadece sınıfın içinden erişilebilir.

Ama soru şuysa

Süper sınıfın özel alanına alt sınıflarından erişebilir miyiz?

Bu, özel üyeye erişmek için ne yapacağınız önemli değil. Bu durumda, süper sınıfta genel yöntem yapabiliriz ve özel üyeye erişebilirsiniz. Yani, bu durumda özel üyeye erişmek için bir arayüz / köprü oluşturuyorsunuz.

C ++ gibi diğer OOP dilleri friend function, diğer sınıfın özel üyesine erişebileceğimiz bir konsepte sahiptir.


0

Bir üst sınıfın miras alındığında, üst sınıfın özel üyelerinin aslında alt sınıfın özel üyeleri haline geldiğini ve alt sınıfın nesnelerine daha fazla miras alınamayacağını veya erişilemez olduklarını basitçe söyleyebiliriz.



-1

Alt sınıf, üst sınıfının özel üyelerini devralmaz. Ancak, üst sınıf, özel alanlarına erişmek için ortak veya korumalı yöntemlere sahipse, bunlar alt sınıf tarafından da kullanılabilir.


-2

Özel üyeler (devlet ve davranış) miras alınır. Sınıf tarafından başlatılan nesnenin davranışını ve boyutunu etkileyebilirler. Mevcut olan veya uygulayıcıları tarafından üstlenilebilecek tüm kapsülleme kırma mekanizmaları yoluyla alt sınıflar tarafından çok iyi görülebildiğinden bahsetmiyoruz.

Kalıtımın "defacto" bir tanımı olmasına rağmen, kesinlikle "hayır" yanıtları ile kabul edilen "görünürlük" yönleriyle bir bağlantısı yoktur.

Yani diplomatik olmaya gerek yok. JLS bu noktada yanlış.

"Miras alınmadıkları" varsayımı güvensiz ve tehlikelidir.

Bu yüzden (tekrar etmeyeceğim) iki defacto (kısmen) çelişen tanım arasında, takip edilmesi gereken tek şey daha güvenli (veya güvenli) olanıdır.


1
-1. JLS dili tanımlar , JLS'nin "yanlış" olması imkansızdır. Ayrıca, kapsüllemeyi kıran mekanizmalar varsa, bu alanın miras aldığı anlamına gelmez; sadece kapsüllemeyi bozan mekanizmalar vardır.
SL Barth - Monica'yı

Bir tanım kendi başına yanlış olabilir. Bunun hakkında daha fazla tartışmak niyetim değil. Buradaki argüman, kapsüllemeyi kesen mekanizmalar (tanrı ya da kötü olabilir) değil, alan / yöntemin orada olması, alt sınıfınızın davranışını ve durumunu etkilemektedir. Yani "kalıtsal". Bir sınıfta 100kb özel bayt dizisi kullanılabilir ve sadece onun (jumbo) torunları onu miras olmadığını varsayalım. Bu noktayı kaçırmayın ve bunu iyi ya da kötü bir uygulama olarak yargılayın (abartı bir noktaya değinmeye yardımcı olur): öngörülen, meşru bir eylemdir. Özel üyeler "miras alınır".
gkakas
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.