在Java中覆盖非虚方法时,建议使用@Override注释,但是如果实现抽象方法怎么办?我也应该使用@Override吗?
每种方法的优点和缺点是什么?
什么时候应该选择什么?做出这个决定时应该记住哪些要点?
我刚开始用一个例子来解释它:
public abstract class A{
static String str;
}
public class B extends A{
public B(){
str = "123";
}
}
public class C extends A{
public C(){
str = "abc";
}
}
public class Main{
public static void main(String[] args){
A b = new B();
A c = new C();
System.out.println("b.str = " + b.str);
System.out.println("c.str = " + c.str);
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印出来:
b.str = abc
c.str = abc
但我想要一个解决方案,其中实例化超类的每个子类都有自己的类变量,同时我希望能够通过标识符引用该类变量,或者在抽象超类中定义的方法调用.
所以我希望输出为:
b.str = 123
c.str = abc …
出于好奇,我尝试覆盖基类中的抽象方法,并实现抽象方法.如下:
public abstract class FirstAbstract
{
public abstract void SomeMethod();
}
public abstract class SecondAbstract : FirstAbstract
{
public abstract override void SomeMethod();
//?? what sense does this make? no implementaion would anyway force the derived classes to implement abstract method?
}
Run Code Online (Sandbox Code Playgroud)
很想知道为什么C#编译器允许编写'抽象覆盖'.这不是多余的吗?应该是一个编译时错误来做这样的事情.是否适用于某些用例?
谢谢你的关注.
我不问这个 - > 为什么Java中没有多重继承,但允许实现多个接口?
在Java中,不允许多重继承,但是,在Java 8之后,Interfaces可以拥有默认方法(可以自己实现方法),就像抽象类一样.在此上下文中,还应允许多重继承.
interface TestInterface
{
// abstract method
public void square(int a);
// default method
default void show()
{
System.out.println("Default Method Executed");
}
}
Run Code Online (Sandbox Code Playgroud) 我来自c#,这很容易,而且可能.
我有这个代码:
public abstract class clsAbstractTable {
public abstract String TAG;
public abstract void init();
}
Run Code Online (Sandbox Code Playgroud)
但是Eclipse告诉我我使用非法修改器.
我有这门课:
public class clsContactGroups extends clsAbstractTable {
}
Run Code Online (Sandbox Code Playgroud)
我希望以这种方式定义变量和方法,Eclipse 提示我,我没有实现抽象变量和方法.
我如何定义我的抽象类,以便提示我实现摘要?
编辑1
我将为不同的db表创建不同的类.每个类都应该有自己的TABLENAME变量,没有例外.每当我创建一个扩展抽象类的新类时,我必须确保这个变量是静态的.
然后在抽象类中我将有一个方法例如:init();
如果在这个init()方法中我调用TABLENAME,它应该从子类中获取值.
这样的事情也应该成功
String tablename=(clsAbstract)objItem.TABLENAME;
// where objItem can be any class that extended clsAbstract;
Run Code Online (Sandbox Code Playgroud)
编辑2
我希望在每个类中定义一个常量(静态),其名称用abstract定义.
众所周知,有些语言有接口的概念.这是Java:
public interface Testable {
void test();
}
Run Code Online (Sandbox Code Playgroud)
如何以最紧凑的方式在C++(或C++ 11)中实现这一点并且代码噪声很小?我很欣赏一个不需要单独定义的解决方案(让标题足够).这是一个非常简单的方法,即使我发现越野车;-)
class Testable {
public:
virtual void test() = 0;
protected:
Testable();
Testable(const Testable& that);
Testable& operator= (const Testable& that);
virtual ~Testable();
}
Run Code Online (Sandbox Code Playgroud)
这只是一个开始......而且已经超过了我想要的时间.怎么改进呢?也许在std命名空间的某个地方有一个基类专为此而设计?
如何强制子类在Ruby中实现方法.在Ruby中似乎没有一个抽象关键字,这是我在Java中采用的方法.还有另外一种类似Ruby的方法来强制抽象吗?
我注意到你不能在PHP中使用抽象常量.
有没有办法可以强制子类定义一个常量(我需要在其中一个抽象类内部方法中使用)?
abstract ×10
java ×5
interface ×3
c# ×2
overriding ×2
annotations ×1
c++ ×1
c++11 ×1
class ×1
constants ×1
enums ×1
inheritance ×1
java-8 ×1
php ×1
polymorphism ×1
ruby ×1
static ×1
variables ×1
virtual ×1