2011-08-31 49 views
3

這就是我現在所擁有的:獲取財產爲抽象類

public abstract class SampleClass 
{ 
    public abstract void ShowAll(); 
    public abstract void ExecuteById(int id); 
    public string sampleString{get;} 
} 

public sealed class FirstClass : SampleClass 
{ 
    public override string sampleString 
    { 
     get { return "AA"; } 
    } 


    public override void ShowAll() 
    { 
     ...... 
    } 

    public override void ExecuteById(int id) 
    { 
     ...... 
    } 
} 

public sealed class SecondClass : SampleClass 
{ 
    public override string sampleString 
    { 
     get { return "BB"; } 
    } 

    public override void ShowAll() 
    { 
    ...... 
    } 

    public override void ExecuteById(int id) 
    { 
    ...... 
    } 
} 

現在我添加了一個功能,這樣每個類

public void runStoredProcedure(string sampleString) 
{ 
    SQLClass.ExecuteStoredProcedure(sampleString) 
} 

一個這樣做的方式是對的只需將此作爲抽象添加到sampleClass,並將其作爲FirstClass和SecondClass的ovverride添加即可。儘管唯一的區別是傳遞參數(samplestring)。

的問題:是有可能的地方把這個功能(可能在SampleClass)和重寫字符串傳遞從第一/第二類此功能,以避免開銷?

回答

3

是的。你通常想要做的是聲明的孩子必須定義爲抽象的東西(所以繼承類覆蓋它們)。屬性可以是抽象的也:

public abstract class MyBase { 
    public void Execute() { 
     Console.WriteLine(MyString); 
    } 

    // Notice that this has no body, because it is abstract. Also, I don't need a setter. 
    protected abstract String MyString { get; } 
} 

public class MyChild : MyBase { 
    protected String MyString { get { return "Foo"; } } 
} 

public class MyOtherChild : MyBase { 
    protected String MyString { get { return "Bar"; } } 
} 

那麼你可以做:

var myChild = new MyChild(); 

// Prints "Foo" 
myChild.Execute(); 

var myOtherChild = new MyOtherChild(); 

// Prints "Bar" 
myOtherChild.Execute(); 
-1

好的我想我知道你在說什麼,所以讓我重申一下,以便清楚。

基類具有PropertyA 子B類覆蓋PropertyA 子C類覆蓋PropertyA

你希望能夠基於該調用來自B和C通過從物業一個正確的值相同的方法類?

內,您的基類中添加方法

MyMethod(string value) 
{ 
    // Do Stuff 
} 

裏面的子類

MyMethod(this.PropertyA); 

話雖這麼說,你爲什麼要試圖做到這一點?從基類繼承時,屬性A屬於子類,您可以將其設置爲子類中想要的任何值。在這種情況下,我通常在Sub Class中設置值或使用接口。

0

當然。這是抽象類的重點。

0

更改上runStoredProcedure您的訪問修飾符(基類)來保護。這樣你可以從你的派生類訪問它。

protected void runStoredProcedure(string sampleString) 
{ 
    SQLClass.ExecuteStoredProcedure(sampleString) 
}