获取属性到抽象类

时间:2011-08-31 01:00:46

标签: c#

这就是我现在所拥有的:

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,并作为ovverride添加到FirstClass和SecondClass。唯一的区别是传递参数(samplestring)。

问题:是否可以将此函数放在某处(可能在SampleClass中)并将覆盖字符串从First / Second类传递给此函数以避免开销?

4 个答案:

答案 0 :(得分: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 :(得分:0)

不确定。这是一个抽象类的重点。

答案 2 :(得分:0)

将runStoredProcedure(在基类中)的访问修饰符更改为protected。这样你就可以从派生类中访问它。

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

答案 3 :(得分:-1)

好的,我想我知道你在说什么,所以让我重新说明一下。

基础A类有PropertyA 子类B优先于PropertyA 子类C覆盖PropertyA

您希望能够从B和C调用相同的方法,根据类传递属性A中的正确值吗?

在基础类A中添加方法

MyMethod(string value)
{
    // Do Stuff
}

在子类中

MyMethod(this.PropertyA);

有人说你为什么试图这样做?当您从基类继承时,属性A属于SubClass,您可以将其设置为子类内所需的任何值。在这种情况下,我通常在子类中设置值或使用接口。