[英]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.