抽象类是否只有方法签名而没有像接口这样的实现?

时间:2012-07-04 06:35:50

标签: c# java .net oop

与Interfaces一样,抽象类只有方法签名才能实现吗?如果是的话:

  1. 抽象类与接口有何不同?
  2. 另一个具有抽象类作为基类的类如何实现基类方法的主体?

8 个答案:

答案 0 :(得分:2)

  

与Interfaces一样,抽象类只有方法签名才能实现吗?如果是的话:

是的,但也可以实施......

您可以在abstract类中使用与interfaces不同的方法实现,但是您无法创建abstract class的实例

  

Interfaces and Abstract Classes

     

Abstract Class versus Interface

答案 1 :(得分:2)

Java中的

q1:抽象类可以包含方法定义和常规方法,而接口则不能。

q2:来自http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

//this is the abstract class
public abstract class GraphicObject {
  abstract void draw();
}

//this is the implementation 
class Rectangle extends GraphicObject {
  void draw() {
    ...
  }
}

答案 2 :(得分:2)

  

与Interfaces一样,抽象类只能使用方法签名而不实现吗?

即可。抽象类可以有方法实现。

  

它与Interface的区别?

接口中声明的变量默认为final。抽象类可能包含非最终变量。

默认情况下,接口的成员是公共的。抽象类可以具有类似私有,受保护等类通常的类成员。

接口绝对是抽象的,无法实例化;抽象类也不能实例化,但如果main()存在则可以调用。

与抽象类相比,接口很慢,因为它需要额外的间接。

请参阅以下链接:

http://forums.asp.net/t/1240708.aspx/1

http://java.sys-con.com/node/36250

http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

答案 3 :(得分:2)

  1. 接口是一个完全抽象的类,
    仅表示签名,没有实现,没有数据成员 另一方面,通过定义的抽象类需要至少一种抽象方法 它也可以实现。 它还可以包含将继承到其继承者的数据成员。
  2. 继承者需要实现具有相同签名的抽象方法才能实现它

答案 4 :(得分:2)

抽象类可以包含实现,但它不必包含。这是使其与接口不同的一件事。

abstract class classA
{
    abstract public void MethodA();

    public void MethodB()
    {
        Console.WriteLine("This is MethodB inside ClassA");
    }
}

class classB : classA
{

    public override void MethodA()
    {
        Console.WriteLine("This is MethodA inside class B");
    }
}

如果在抽象基类中实现方法并希望以后能够覆盖它,则需要将该方法声明为虚拟。

virtual protected void MethodC(){
  //this can be overridden
}

答案 5 :(得分:1)

在JAVA中是的,

  1. 如果以这种方式使用抽象类,则接口和抽象类之间没有区别。什么剂量抽象类真正重要的是你可以提供期望由子类继承的通用实现,这是接口无法做到的。

  2. 是的,就像我说的那样,抽象类的行为方式与接口相同,你只需覆盖子类中的方法

  3. 例如:

    public abstract class AbstractClassWithoutImplementation {
    
    public abstract String methodA();
    

    }

    public class Implementation extends AbstractClassWithoutImplementation {
    
    @Override
    public String methodA() {
        // TODO Auto-generated method stub
        return "Yes";
    }
    
    public static void main(String[] args){
        Implementation im = new Implementation();
        System.out.println(im.methodA());
    }
    

    }

答案 6 :(得分:1)

抽象类是无法实例化的类。它位于具体类(完全实现)和接口(完全没有实现)之间。

它可以包含完全实现的常规成员(变量,方法等)。

它还可以包含未实现的抽象成员。任何未实现的成员(例如方法签名)都必须标记为抽象。

所以回答你的问题:

  

与Interfaces一样,抽象类只有方法签名才能实现吗?

你的措辞不够明确,不能给出是或否答案。抽象类可以实现方法,它可以具有未实现的抽象方法,必须将其标记为abstract。除非标记为abstract,否则不能拥有未实施的方法。

  

如果是:它与界面有什么不同?

因为它允许实现成员。

  

另一个类(此Abstract类作为基类)如何实现该方法的主体?

只需要实现所有抽象成员。

public abstract class A
{ 
    public abstract void Test();
}

public class B : A
{
    public void Test(){ return; }
}

答案 7 :(得分:1)

Like Interfaces, can an abstract class have only method signature without implementation? If yes:

是的, abstract类可以拥有所有abstract方法,即使它只有一个抽象方法,它必须是abstract。您可以声明一个类abstract,即使它没有任何abstract方法。

How it differs from Interface?

在界面中所有方法都是abstract public在抽象类中下注,没有必要。请阅读Interface vs Abstract Class

How another class, for which this Abstract Class is acting as a base class, can implement the body of that method?

如果您的BaseClass是摘要且ChildClass正在扩展基类,则可以在abstract中实施ChildClass方法,否则请ChildClass abstrac t还

public class ChildClass extends BaseClass{

void display(){

    /// Your Implementation here
}

}

abstract class BaseClass{

abstract void display();
}