c# - 创建一个抽象函数,它根据继承者接受不同的参数

标签 c# function inheritance abstract

我偶然发现了一个我想不出好的解决方法的问题。

我的程序中有一些对象需要在发生某些事件时重新初始化。我需要重新初始化的对象是抽象类的子类。

虽然这似乎是一种糟糕的方法,但我决定在抽象类中有一个抽象的重新初始化函数,并让所有子类实现该函数。但是现在存在每个子类在其构造函数中采用不同参数的问题。

我的最小示例如下所示:

abstract class Base
{
    public abstract void Init(/* Some parameter */);
}

class SubA : Base
{
    public SubA(int a)
    {
        Init();
    }

    public override void Init(int a)
    {
        //do stuff with int
    }
}

class SubB : Base
{
    public SubB(string b)
    {
        Init();
    }

    public override void Init(string b)
    {
        //do stuff with string
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<Base> stuff = new List<Base>()
        {
            new SubA(65),
            new SubB("B")
        };

        foreach (var s in stuff)
        {
            s.Init();
        }
    }
}`

我确实相信这个解决方案有代码味道,所以欢迎任何避免这种情况的建议。如果需要任何其他信息来帮助我,请告诉我。

最佳答案

好吧,解决方案很简单,只需在私有(private)字段中声明特定 变量并在paramaterless Init 方法中使用这些字段,如下所示:

class SubA : Base
{
    private int _a;
    public SubA(int a)
    {
        _a = a;
        Init();
    }

    public override void Init()
    {
        //do stuff with int _a
    }
}

class SubB : Base
{
    private string _b;
    public SubB(string b)
    {
        _b = b;
        Init();
    }

    public override void Init()
    {
        //do stuff with string _b
    }
}

此外,您还可以创建抽象类接口(interface),这样实现它的类也可以从其他基类继承。

关于c# - 创建一个抽象函数,它根据继承者接受不同的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58843775/

相关文章:

Java:公开 protected 方法的简单方法

c# - Integrated Security=True 与 Encrypt=Yes 用法有什么区别?

c# - XElement 中的 XML 解析 ':'

c# - 不同的 DataContext 错误。为什么这是个问题?

javascript - 如何在函数中处理时获取更新的值

entity-framework - 使用 Include 的派生类的急切加载属性

c# - LINQ TO XML 解决方案

svg 绘图上的 Javascript 函数

javascript - JS : functions arguments default values

SQL Oracle 继承关系数据库