在抽象 class 中创建方法而不是在扩展它的 class 中覆盖它们是一种好习惯吗?
Is it a good practice to create methods inside an abstract class and not override them inside the class which extends it?
我有一个问题。
我应该在抽象 class 中创建 getter 和 setter 方法吗?下面的示例在抽象 class 中包含这些方法,它由 Individual class 扩展。在 abstract class 中使用不同的方法是一种好习惯吗?我应该覆盖 Individual class 中的那些方法吗?但是,覆盖它们对我来说没有意义,因为它们不会做任何不同的事情,只是设置和获取不同的属性。有什么建议吗?
public abstract class Human {
private String name;
private String surname;
public Human(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
public class Individual extends Human{
private String dob;
public Individual(String name, String surname, String dob) {
super(name, surname);
this.dob = dob;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public void viewIndividual(){
System.out.println("First name of individual is: " + getName());
System.out.println("Surname of individual is: " + getSurname());
System.out.println("Date of birth of individual is: " + getDob());
}
}
Should I create getter and setter methods inside abstract class?
是的,如果一个方法对于大多数预期的抽象实现是通用的 class,那么在抽象 class 中实现这些方法是完全没问题的。如果为您的 Human
的属性设置 getter 和 setter 真的很好,这很难说。您当前使用它的方式没有多大意义,因为您将行为方面 (viewIndividual) 与数据方面 (getters 和 setters) 混合在一个 class 中。鉴于上面的代码,您可以在抽象 class 中使用受保护的成员,并可能使用 setter 来避免实现中的代码重复。但是,如果您想将对象用作 Java-Beans,那很好。
Is it a good practice to have different variety on methods inside abstract class?
你是指抽象方法和非抽象方法?是的,这是非常标准的。举个例子:
public abstract class Example {
public final void publicMethod() {
// do some preparations
internalMethod();
// do some cleanup
}
protected abstract void internalMethod();
}
Example
实现的消费者将只能访问 publicMethod
并且保证执行所有需要的准备和清理任务,而无需在实现中一遍又一遍地重复此代码Example
因为只有 internalMethod
需要覆盖。
Should I be overriding those methods inside Individual class?
不,绝对不是。至少只要你不向方法添加额外的功能,抽象方法不应该仅仅为了在实例化中实现它们而被覆盖 class.
一般来说,如果您在深层类型层次结构中实现某些内容,您应该小心继承,因为代码往往会变得非常难以理解。恕我直言,层次结构开始变得难以使用,层次结构级别已经达到 4-5,但这可能在很大程度上是基于意见的。规则是优先使用组合而不是继承,以避免为简单的实用程序过度使用继承。
我有一个问题。
我应该在抽象 class 中创建 getter 和 setter 方法吗?下面的示例在抽象 class 中包含这些方法,它由 Individual class 扩展。在 abstract class 中使用不同的方法是一种好习惯吗?我应该覆盖 Individual class 中的那些方法吗?但是,覆盖它们对我来说没有意义,因为它们不会做任何不同的事情,只是设置和获取不同的属性。有什么建议吗?
public abstract class Human {
private String name;
private String surname;
public Human(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
public class Individual extends Human{
private String dob;
public Individual(String name, String surname, String dob) {
super(name, surname);
this.dob = dob;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public void viewIndividual(){
System.out.println("First name of individual is: " + getName());
System.out.println("Surname of individual is: " + getSurname());
System.out.println("Date of birth of individual is: " + getDob());
}
}
Should I create getter and setter methods inside abstract class?
是的,如果一个方法对于大多数预期的抽象实现是通用的 class,那么在抽象 class 中实现这些方法是完全没问题的。如果为您的 Human
的属性设置 getter 和 setter 真的很好,这很难说。您当前使用它的方式没有多大意义,因为您将行为方面 (viewIndividual) 与数据方面 (getters 和 setters) 混合在一个 class 中。鉴于上面的代码,您可以在抽象 class 中使用受保护的成员,并可能使用 setter 来避免实现中的代码重复。但是,如果您想将对象用作 Java-Beans,那很好。
Is it a good practice to have different variety on methods inside abstract class?
你是指抽象方法和非抽象方法?是的,这是非常标准的。举个例子:
public abstract class Example {
public final void publicMethod() {
// do some preparations
internalMethod();
// do some cleanup
}
protected abstract void internalMethod();
}
Example
实现的消费者将只能访问 publicMethod
并且保证执行所有需要的准备和清理任务,而无需在实现中一遍又一遍地重复此代码Example
因为只有 internalMethod
需要覆盖。
Should I be overriding those methods inside Individual class?
不,绝对不是。至少只要你不向方法添加额外的功能,抽象方法不应该仅仅为了在实例化中实现它们而被覆盖 class.
一般来说,如果您在深层类型层次结构中实现某些内容,您应该小心继承,因为代码往往会变得非常难以理解。恕我直言,层次结构开始变得难以使用,层次结构级别已经达到 4-5,但这可能在很大程度上是基于意见的。规则是优先使用组合而不是继承,以避免为简单的实用程序过度使用继承。