CompareTo (Object o) yöntemini burada nasıl tamamlayabilirim?

Bu soyut sınıftır:

public abstract class AbstractRecord {
    /**
     * Simple getter for the similarity 
     * 
     * @return int containing the similarity
     */
    public abstract int getSimilarity();

    /**
     * Simple getter for the title String
     * 
     * @return String containing the title
     */
    public abstract String getTitle();

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "["+this.title+":"+this.similarity+ "]";
    }
}

ve bu genişletilmiş sınıftan:

public class Record extends AbstractRecord implements Comparable{
    private int similarity;
    private String title;

    public Record(String title, int similarity) throws IndexException {
        if (title == null || title.isEmpty() || similarity < 0) {
            throw new IndexException("Missing title");
        }
        this.similarity = similarity;
        this.title = title;
    }


    @Override
    public int compareTo(Record r) {
        int result;
        result = r.compareTo( //what should I put here? );
        return result;
    }

    @Override
    public int getSimilarity() {
        return similarity;
    }

    @Override
    public String getTitle() {
        return title;
    }

}

Sadece süper değişken problemi çözüldü ve işte yeni bir problem .. Burada CompareTo() yöntemini burada nasıl düzeltebilirim, Kayıt r'yi yerel olanla karşılaştırmaya çalışıyorum. Teşekkür ederim!

1
getter abstract 'ü yapın, ardından tüm veriler netleşecektir.
katma yazar Boris the Spider, kaynak
Alt sınıftaki değişkeni eklediyseniz, üstbilgiyi "overwri [te]" yapmayacak bir hata ayıklayıcısına kendinizi ikna edin.
katma yazar ChiefTwoPencils, kaynak
Sadece alt sınıfta beyan etmeyin. Baz sınıfın değişkenlerine doğrudan erişebilirsiniz.
katma yazar isnot2bad, kaynak
Btw: Neden kendi alıcılarını orada uygulamıyorsanız, temel sınıftaki iki alanı neden bildiriyorsunuz?
katma yazar isnot2bad, kaynak

7 cevap

 private int similarity;
 private String title;

Alt sınıfta başlık ve benzerlik bildirmeye gerek yok, süper anahtar kelime kullanarak başlatabilirsiniz

5
katma
@Ryan her iki alan da korumalı olduğu için, alt sınıflar tarafından otomatik olarak devralınırlar. Böylece bunları alt sınıf seviyesinde beyan edilmiş gibi kullanabilirsiniz. ( this.similarity )
katma yazar isnot2bad, kaynak
Süper sınıftaki değeri nasıl alabilirim?
katma yazar Ryan, kaynak

Kayıt sınıfının title ve benzerliği üyeleriniz aynı AbstractRecord adının üyelerini gizler.

SoyutRecord öğelerinin hepsinde title ve benzerlik varsa, getTitle() ve Record yerine AbstractRecord içinde kod> getSimilarity() .

2
katma

değişkenleriniz otomatik olarak devralınır. Alt sınıfta bildirmeye gerek yoktur. Üst sınıf değişkenini geçersiz kılmayacak

public class Record extends AbstractRecord implements Comparable{
    //your methods here
}

Yukarıdaki kod yeterli olmalıdır

0
katma

Alt sınıftaki title ve benzerlik niteliklerini yeniden tanımlamamalı ve gerçek özniteliklerin tanımlandığı sınıfta abstract alıcılarını yapmamalısınız. karmaşık. Daha sonra, bir kural olarak, bir sınıftaki öznitelikler sınıfta başlamalıdır.

Alt sınıflar, tüm public ve korumalı üyelerini (yöntemler ve öznitelikler) devralır. Bu, onu yeniden belirtmek zorunda kalmadan kullanabileceğiniz anlamına gelir.

Aşağıdaki kodun basitleştirilmiş sürümünde, farklı kısıtlamalara sahip farklı alt sınıflara sahip olabileceğinizi varsayarak, alt sınıf yapıcısında parametre denetimini sürdürdüm. Kayıtların karşılaştırması sadece title ve benzerlik ise, bunu AbstractRecord 'da uygulayabileceğinizi unutmayın.

public abstract class AbstractRecord {
    protected String title;
    protected int similarity;

    protected AbstractRecord(String title, int similarity) {
        this.title = title;
        this.similarity = similarity;
    }

    public  int getSimilarity() {return similarity;}

    public  String getTitle() {return title;}

    public String toString() {
        return "["+this.title+":"+this.similarity+ "]";
    }

   //some abstract methods
}

public class Record extends AbstractRecord implements Comparable{

    public Record(String title, int similarity) throws IndexException {
        super(title, similarity);
        if (title == null || title.isEmpty() || similarity < 0) {
            throw new IndexException("Missing title");
        }
    }

    @Override
    public int compareTo(Record r) {
        return 0;
    }
   //implementation of abstract methods from AbstractRecord 
} 
0
katma

Her iki temel sınıf alanı da çocuk sınıfına devredilecek. Temel sınıftaki alanlara erişmek için süper anahtar kelimesini kullanmanız yeterlidir:

super.similarity and super.title

0
katma

protected korumalı veya public alanlarınızı oluşturun. Güvenlik ve erişim izni için korumalı önerilmektedir.

0
katma

her şeyden önce ana sınıfı ( AbstractRecord ) değişkenini başlatmanız gerekir süper anahtar kelimesi ile alt sınıf kurucusunda veya alt sınıfta yapılabilir

super.title = "value";

Bu aynı anahtar kelimeye erişmek için de kullanabilirsiniz.

public String getParentTitle(){
     return super.title;
}
0
katma