将属性放入抽象类

本文关键字:抽象类 属性 | 更新日期: 2023-09-27 18:07:10

这是我现在的情况:

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的覆盖。虽然唯一的区别是传递参数(samplestring)。

问题:是否有可能将这个函数放在某个地方(可能在SampleClass),并从第一/第二类传递覆盖的字符串到这个函数,以避免开销?

将属性放入抽象类

是。您通常想要做的是声明子类必须定义为抽象的东西(因此继承类必须覆盖它们)。属性也可以是抽象的:

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();

当然。

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

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

好的,我想我知道你在说什么,所以让我重申一遍,只是为了更清楚。

基类A具有属性A子类B覆盖属性a子类C重写属性a

你想要能够调用相同的方法从B和C传递正确的值从属性A基于类?

在基类A中添加方法

MyMethod(string value)
{
    // Do Stuff
}

在你的子类

MyMethod(this.PropertyA);

话虽如此,你为什么要这么做?当你从基类继承时,属性A属于子类,你可以在子类内将其设置为你想要的任何值。在这种情况下,我通常在子类中设置值或使用接口。