簡體   English   中英

不同參數Java的抽象方法

[英]Abstract method with different parameters Java

public abstract class CommonClass {

      abstract void send(<what should i put here???>) {}
    }   

 public class ClassA extends CommonClass {

      void send(List<Comments> commentsList) {
            // do stuff
      }
    }

 public class ClassB extends CommonClass {

      void send(List<Post> postList) {
            // do stuff
      }
    }

我是OODP的新手,我正在嘗試一種能夠接收任何類型的List數據的方法,以便我可以抽象出來。 我怎樣才能做到這一點?

您可以在某些類型T上使其成為通用的。 喜歡,

public abstract class CommonClass<T> {
    abstract void send(List<T> al);
}   

然后,實現它 - 使用泛型。 喜歡,

public class ClassA extends CommonClass<Comments> {
    @Override
    void send(List<Comments> commentsList) {
        // do stuff
    }
}

public class ClassB extends CommonClass<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

此外,正如評論中所討論的,您的類名可以更加直觀; 就像是,

public abstract class AbstractSender<T> {
    abstract void send(List<T> al);
}

然后

public class CommentSender extends AbstractSender<Comment> {
    @Override
    void send(List<Comment> commentsList) {
        // do stuff
    }
}

public class PostSender extends AbstractSender<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

這具有更易讀和更容易推理的優點(我可以通過閱讀名稱告訴PostSender做什么, ClassB不是那么多)。

最后 ,這看起來像一個接口可以工作的情況,因為你的abstract class是純虛擬的(並且應該是首選的,因為你可以實現多個接口,但只能從單個父類擴展);

public interface ISender<T> {
   void send(List<T> al);
}

public class CommentSender implements ISender<Comment> {
    @Override
    void send(List<Comment> commentsList) {
        // do stuff
    }
}

public class PostSender implements ISender<Post> {
    @Override
    void send(List<Post> postList) {
        // do stuff
    }
}

為了實現這一目標,您可以采取多種方法,我建議查看泛型: https//docs.oracle.com/javase/tutorial/java/generics/index.html

有了這個,有一種方法是最優雅和簡單的:你可以提供List<T> ,其中T是泛型類型。

public abstract class CommonClass<T> {

      abstract void send(List<T>) {}

}   

 public class ClassA extends CommonClass<Comment> {

      void send(List<Comments> commentsList) {
            // do stuff
      }
}

 public class ClassB extends CommonClass<Post> {

      void send(List<Post> postList) {
            // do stuff
      }
}

你可以借助泛型來做到這一點。 https://www.tutorialspoint.com/java/java_generics.htm


抽象類

public abstract class CommonClass {
    public abstract <T> void send(List<T> data);
}

它的孩子

public class Child extends CommonClass {

    public <T> void send(List<T> data) {
        // code here
    }
}

檢索列表的內容

檢索生成列表的內容類似於檢索任何列表的內容。 在該方法的范圍內,“T”是列表中包含的一種對象。

for (T t : data) {
    // to check if t is a string
    if (t instanceof String) {
        // code
    }
}

您還可以使用lambdas檢索列表中的每個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM