2014-06-30 39 views
1

接口 - I1(包含M1方法) 類 - C1:I1(C1實現I1) 類 - C2:C1(C2繼承C1)如何跳過執行接口的類

interface I1 
{ 
    void M1(); 
} 
class C1 : I1 
{ 
    void M1(){} 
} 
class C2 : C1 
{ 
} 

要求: 不應該有「M1」中的「C1」的任何實現,基本上是「M1」需要「C2」中實現

如何使用任何的OOPS概念實現這一目標?

+0

我加你的第一線的輪廓更易於理解(IMO),請隨時修改或恢復,如果你不相信這是可以接受的 – Sayse

回答

4

C1作爲抽象方法抽象並定義爲M1

2

您正在尋找抽象method[wiki]

一種抽象方法,是一個只有簽名,沒有執行 體。它通常用於指定子類必須提供方法的實現。抽象方法用於在某些計算機語言中指定接口。

Abstract methods in C#

抽象方法聲明引入一個新的虛擬方法,但 不提供該方法的實現。相反, 非抽象派生類需要通過重寫該方法來提供自己的 實現。因爲抽象方法 沒有提供實際的實現,所以抽象方法的主體只包含一個分號。

你的情況:

interface I1 
{ 
    void M1(); 
} 

abstract class C1 : I1 
{ 
    public abstract void M1(); 
} 

class C2 : C1 
{ 
    public override void M1() 
    { 
     // Your code here 
    } 
} 
9

只要你能忍受C1是抽象的,但是工作原理:

interface I1 
{ 
    void M1(); 
} 

abstract class C1 : I1 
{ 
    public abstract void M1(); 
} 

class C2 : C1 
{ 
    public override void M1() 
    { 
     // 
    } 
} 

編輯:作爲Isantipov在註釋中提到你能避免這樣的抽象類:

class C1 : I1 
{ 
    public virtual void M1() 
    { 
     throw new NotSupportedException(); 
    } 
} 
+1

如果你不能有c1抽象,你可以做的唯一事情(除了改變你的架構,以避免繼承)是使M1垂直,並拋出NotSupportedExcetion(http://msdn.microsoft.com/zh-cn/library/default.aspx)。 com/en-us/library/system.notsupportedexception(v = vs.110).aspx)在其C1執行中) – Isantipov

+0

謝謝大衛,明白了。 – Avinash

0

替代答案。
您可以有多個接口。 .NET Fiddle

interface I1 
{ 
    void someCommonMethod(); 
} 

interface I2 
{ 
    void M1(); 
} 

然後你的類可以像這樣繼承。

class C1 : I1 
{ 
    public void someCommonMethod() 
    { 
     ... 
    } 
} 

class C2 : C1, I2 
{ 
    public void M1() 
    { 
     ... 
    } 
} 
1

您可以使C1抽象或您可以使用顯式實現。這意味着它已經實現,但它不可見。

class C1 : I1 
{ 
    void I1.M1(){ throw new NotImplementedException(); } 
} 

是無效的。這樣稱呼它:

C1 c1 = new C1(); 
c1.M1(); //Error