2016-01-18 175 views
-1

在接口中聲明的方法是否總是抽象?我們如何使用抽象類和接口實現多重繼承。這個實現與java的實現不同嗎?C#接口中的方法,抽象類

+1

是 - 接口在設計上是抽象的。你不能提供實現和接口。 –

+1

是的。在C#中你不能(但在其他.NET語言中是可能的)。去做就對了。當然是。 –

+1

@AlexRumba如果你想看看我的項目如何實際使用一個抽象類和接口,下面是它的鏈接:https://github.com/Sweeper777/MineTris – Sweeper

回答

3

是在接口中聲明的方法總是抽象的?

是的! C#接口只能包含抽象方法。

我們如何在接口中使用靜態方法。

我很確定你不能在接口中聲明靜態方法。即使你可以,也沒有必要這樣做。靜態方法可以在任何地方調用,對吧?那麼爲什麼你想把它們放入界面?把它們放在靜態類中!

我們如何使用抽象類和接口實現多重繼承。

我們不能。 C#不支持多繼承。一個班級只能從一個班級繼承只有!這是因爲C++中的多重繼承大大增加了代碼的複雜性。但類可以實現多個接口。我們只能用它們做多態性

順便說一句,抽象類是一種類。

是那個java的

的這取決於你的意思執行做不同的實現。

如果你的意思是實現接口的方式,是的,它們差不多都是相同的*。如果你的意思是接口的語言實現,否則每種語言都是不同的。

*但是在C#中,您可以明確地實現一個接口。在Java中你不能。

編輯:

閱讀您的評論後,我知道你想展示一個繼承抽象類和接口的類的實例。幸運的是,我做了一個項目,它包含了這種東西!

很久以前我寫了一個俄羅斯方塊遊戲,這裏是它的基本模型。

我有一個TetrisBlock類,它代表一個單一的Tetris塊。和代表一塊俄羅斯方塊的Tetrimino類,例如

口 
口口口 

有很多種tetriminos的,所以Tetrimino是一個抽象類。類如LShapedTetriminoTShapedTetrimino繼承它。

然而,一些tetriminos可以旋轉,但有些卻不能,如

口口 
口口 

這樣可以旋轉的人實現了一個名爲IRotatable的接口。

public interface IRotatable { 
    void Rotate(); 
} 

如果您還不知道,接口實現是「可以用作」或「有能力」的關係。所以在這種情況下,一些tetriminos有旋轉的能力,但有些則不能。這就是爲什麼一些tetriminos實現界面,但有些不這樣做。

這一切都很完美,不是嗎?

「但是我可以將旋轉方法放在Tetrimino類中,爲什麼我需要一個界面呢?」你問。那麼IMO,C#是一種面向對象的語言,OOP的重點就是讓事情變得有意義!有時候讓代碼有意義是很好的。我曾經被這很多困惑。我認爲編寫代碼是關於實際的東西。但那不是全部。你也需要讓事情變得有意義。這就是OOP的要點。

1

是的,在接口中聲明的方法是抽象的。

一個接口只包含方法定義但不包含任何代碼。你需要實現界面中定義的所有方法。 抽象類是一個不能實例化但可以包含代碼的類。

一個類可能從多個接口繼承。但一個類可能只從一個抽象類繼承。

的多重繼承的概念主要是在C#中相同和Java

示例代碼

//ABSTRACT CLASS: 
public abstract class Car 
{ 
    public abstract void Manufactured(); //abstract method 
} 

public class Honda : Car 
{ 
    public override void Manufactured() 
    { 
     Console.WriteLine("Honda is a Japanese car."); 
    } 
} 

public class Renult : Car 
{ 
    public override void Manufactured() 
    { 
     Console.WriteLine("Renault is a Franch car."); 
    } 
} 

    //INTERFACE: 
public interface IBike 
{ 
    void Manufactured(); 
} 
public interface KBike 
{ 
    void Model(); 
} 


public class Suzuki : IBike , KBike // multiple inheritance using interface 
{ 
    public void Manufactured() 
    { 
     Console.WriteLine("Suzuki is prodused on Japan."); 
    } 
    public void Model() 
    { 
     Console.WriteLine("Suzuki is prodused on Japan."); 
    } 

} 

樣品與接口和抽象類

public interface IWork 
{ 
void func(); 
} 
public abstract class WorkClass,IWork 
{ 
public void func() 
{ 
    Console.WriteLine("Calling Abstract Class Function"); 
}} 

public class MyClass:WorkClass{ 
... 
} 
+0

我知道一個接口和一個抽象類是什麼。我想要使​​用抽象和接口的多重繼承的示例說明。 –

+0

@AlexRumba看到我編輯的答案 – Sweeper

+0

upvoted爲你。保持良好的工作。 –

1

爲什麼你想重載一個靜態方法?它甚至說靜態... 我一般會推薦你閱讀有關模式,你可能會找到解決你的問題的東西。

+0

Btw。您可以在Java中進行默認實現:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – maxbit89