C#用不同的" child"实例化类。类

时间:2017-09-19 04:06:29

标签: c#

我有一个有一些派生类的类。这很有效。

我想实例化"父母"类。到目前为止......

但是我想用一个"孩子"来实例化它。课程,然后可能改变那个"孩子"上课后。也许这里的推导是不合适的。

采用以下示例:

public class Unicorn {
    public string Horn { get; set; }
    public Unicorn(){

    }
}

public class BadUnicorn : Unicorn{
    public string Rainbow()
    {
        return "dark rainbow";
    }

}
public class GoodUnicorn : Unicorn{
    public string Rainbow()
    {
        return "light rainbow";
    }
}

我可以实例化其中一个孩子,但是如果我从"好的"为了"坏",我将不得不重新实例化。也许这就是它的方式,如果它完全存在的话,这将是一个可以接受的答案。

我宁愿想要实例化一个Unicorn,然后能够将它从Good变为Bad以维护存储在该Unicorn上的信息,但是可以访问" child"的当前方法和属性。类。

当我打电话给Unicorn.Rainbow()时,它会调用"孩子所需的方法"类。

我对C#有点新鲜,是否有适合此法案的模式?

3 个答案:

答案 0 :(得分:3)

你不能用多态来做你想做的事。您无法将类的实例从一个更改为另一个。一旦创建它,​​它总是相同的类型。

你可以使用合成。

以下是您需要做的事情:

public class Unicorn
{
    public string Horn { get; set; }
    public Unicorn(Rainbow rainbow)
    {
        _rainbow = rainbow;
    }

    public void SetRainbow(Rainbow rainbow)
    {
        _rainbow = rainbow;
    }

    private Rainbow _rainbow;

    public string Rainbow()
    {
        return _rainbow.Colour();
    }
}

public abstract class Rainbow
{
    public abstract string Colour();
}

public class BadRainbow : Rainbow
{
    public override string Colour()
    {
        return "dark rainbow";
    }
}

public class GoodRainbow : Rainbow
{
    public override string Colour()
    {
        return "light rainbow";
    }
}

你可以这样测试:

var unicorn = new Unicorn(new GoodRainbow());
Console.WriteLine(unicorn.Rainbow());

unicorn.SetRainbow(new BadRainbow());
Console.WriteLine(unicorn.Rainbow());

输出:

light rainbow
dark rainbow

Unicorn的实例保持不变,但您可以更改彩虹。

答案 1 :(得分:1)

这是我对代表词典的看法。虽然使用Func而不仅仅是字符串似乎是多余的,但如果该方法具有计算或需要参数等附加功能,那么您将被Func覆盖。

public class Unicorn
{
    static Dictionary<Attitude, Func<string>> RainbowByAttitude =
        new Dictionary<Attitude, Func<string>>()
        {
            [Attitude.Bad] = new Func<string>(() => "dark rainbow"),
            [Attitude.Good] = new Func<string>(()=>"light rainbow")

        };
    public string Horn { get; set; }
    public enum Attitude
    {
        Good,Bad
    }
    public Attitude attitude;
    public Unicorn(Attitude attitude)
    {
        this.attitude = attitude;
    }

    public string Rainbow() => RainbowByAttitude[attitude].Invoke();

}

class Program
{
    static void Main(string[] args)
    {
        Unicorn unicorn;

        unicorn = new Unicorn(Unicorn.Attitude.Bad);
        Console.WriteLine(unicorn.Rainbow());
        unicorn.attitude = Unicorn.Attitude.Good;
        Console.WriteLine(unicorn.Rainbow());

    }
}

答案 2 :(得分:1)

这对我来说似乎是一种状态模式:

public abstract class UnicornState
{
    public abstract UnicornState Change();

    public abstract string Rainbow();
}

public sealed class GoodUnicornState : UnicornState
{
    public override UnicornState Change()
    {
        return new BadUnicornState();
    }

    public override string Rainbow()
    {
        return "light rainbow";
    }
}

public sealed class BadUnicornState : UnicornState
{
    public override UnicornState Change()
    {
        return new GoodUnicornState();
    }

    public override string Rainbow()
    {
        return "dark rainbow";
    }
}

public class Unicorn
{
    public string Horn { get; set; }

    public UnicornState State { get; set; }

    public string Rainbow => State.Rainbow();
}

用法:

var u = new Unicorn();
u.State = new GoodUnicornState();
Console.WriteLine(u.Rainbow);

u.State = u.State.Change();
Console.WriteLine(u.Rainbow);