创建一个根据继承者采用不同参数的抽象函数

问题描述 投票:1回答:2

我偶然发现了一个我认为无法解决的好方法。

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

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

我有的最小示例如下:

abstract class Base
{
    public abstract void Init();
}

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

我确实相信此解决方案具有代码味道,因此欢迎您提出任何避免这种情况的建议。请让我知道是否需要任何其他信息来帮助我。

c# function inheritance abstract
2个回答
0
投票

我认为您可能需要使用一个接口。

public interface IBase
{
    void Init(object obj);
}

public class SubA : IBase
{
    public SubA(int a)
    {
        Init(a);
    }
    public void Init(object obj)
    {
        int a = (int)obj;
        // do stuff
    }
}

public class SubB : IBase
{
    public SubB(string s)
    {
        Init(s);
    }
    public void Init(object obj)
    {
        string s = (string)obj;
        // do stuff
    }
}

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

0
投票

嗯,解决方案很简单,只需在私有字段中声明specific变量,然后在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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.