2013-10-08 63 views
8

我不知道這是否可能,但我試圖從派生類獲取基類實例。在C#中,我可以使用基底關鍵字來訪問基類(當然)的屬性和方法,但我想使用基底本身。試圖這樣做會導致「使用關鍵字'base'在此上下文中無效」錯誤。如何從派生類獲取基類實例

示例代碼

public class SuperParent 
{ 
    public int SPID; 

    public SuperParent() 
    { 
    } 
} 

public class SubChild : SuperParent 
{ 
    public SubChild(int pSPID) 
    { 
     base.SPID = pSPID; 
    } 

    public int BaseSPID 
    { 
     get 
     { 
      SuperParent sp = base; 
      return sp.SPID; 
     } 
    } 
} 
+7

代碼片段值1000字。請提供您想要實現的功能的片段 – ppeterka

+0

您能向我們展示您的代碼嗎,我無法完全理解您要做什麼,謝謝。 –

+1

@TimSchmelter OP知道這一點,但不清楚他想要什麼...也許沿着[「return base;」]這樣的句子(http://stackoverflow.com/questions/14482799/return-base-class -in-c-sharp) – ppeterka

回答

14

如果你使用的派生類的一個實例工作,沒有base instance。 一個例子:

class A 
{ 
    public void Foo() { ... } 
} 

class B : A 
{ 
    public void Bar() { ... } 
} 

什麼是不可能的內B

public void Bar() 
{ 
    // Use of keyword base not valid in this context 
    var baseOfThis = base; 
} 

你可以做這樣的事情:

public void Bar() 
{ 
    base.Foo(); 
} 

,你可以添加另一種方法像

public A GetBase() 
{ 
    return (A)this; 
} 

然後您就可以

public void Bar() 
{ 
    var baseOfThis = GetBase(); 
    // equal to: 
    baseOfThis = (A)this; 
} 

所以這GetBase()方法可能是你想要的東西。

的點睛之筆是:如果你有B一個實例,它繼承了所有屬性和A非被覆蓋的行爲,但它不包括B一個實例持有的(隱藏,但自動)對某A的實例。您可以將B實例投射到A,但它仍然是B的實例。

0

的問題一直沒有得到儘可能清楚,因爲它可以解釋的。但是,通常情況下,最好使用抽象基類和方法,然後重寫所需的方法。那麼你可以在這種情況下按照需要使用base.method(否則你只會派生一個派生類的實例)。

public abstract class foo { 

    public virtual void bar(){..} 
} 

public class footwo : foo { 
    public override void bar(){ 
     // do somethng else OR: 
     return base.bar(); 
    } 
} 

}

0

派生實例是基本實例。這只是內存中的一個對象實例。

例如:

public class A : B 
{ 
} 

var thing = new A(); 

thingA的一個實例,並且也是B的一個實例。
例如,你可以寫這行:
B thing2 = thing;

3

那麼你不是因爲你的問題提供代碼,但我supsect你想要的東西像

class Base 
{ 
    public virtual void Foo() 
    { 
     Console.WriteLine("base"); 
    } 
} 

class Derived : Base 
{ 
    public override void Foo() 
    { 
     Console.WriteLine("derived"); 
    } 

    //// bad 
    //public Base MyBase 
    //{ 
    // get 
    // { 
    //  return base; // Use of keyword 'base' is not valid in this context 
    // } 
    //} 

    // work but... 
    public Base MyBase 
    { 
     get 
     { 
      return (Base)this; 
     } 
    } 
} 

但是請記住,MyBase是真的鍵入Derived

new Derived().MyBase.Foo(); // output "derived" 
0

點1:如果你想比它沒有創建子類中的基類實例值得。你已經有了可供兒童使用的公共事物。第二點:如果你已經初始化子類並且現在想要獲得基類「實例」,那麼如果它沒有被初始化,你怎麼能夠得到它(因爲現在基類實例不存在於物理內存中,並且在那裏僅僅是兒童類實例)?

0
class Parent 
{ 
     private Parent _parent; 
     public Parent() 
     { 
     _parent = this; 
     } 

    protected Parent GetParent() 
    { 
     return _parent; 
    } 
} 

class Child : Parent 
{ 
    private Parent _parent; 
    public Child() 
    { 
     _parent = base.GetParent(); 
    } 
} 
+0

無論代碼有多好,可能不會,但這不會在沒有**清晰和詳細的解釋**的情況下回答問題。 – Enigmativity

相關問題