Наследование и агрегация C#

Вопрос по отношениям между классами. Есть класс Furniture:

class Furniture
{
    public Material Material { get; set; }

    public Furniture(Material mat)
    {
        Material = mat;
    }
 }

А также есть класс Material:

class Material
{
    public string Name { get; set; }

    public Material(string name)
    {
        Name = name;
    }
}

и класс Steel:

class Steel: Material
{
    public void WhatIsIt()
    {
        Console.WriteLine("it is steel");
    }

    public Steel(string name) : base(name)
    {
    }
}

Допустим, что я создаю объекты Steel и Furniture:

Steel s     = new Steel("st1");
Furniture f = new Furniture(s);
f.Material.WhatIsIt(); //ошибка

Я подразумеваю, что создавая объект класса Furniture, я могу передать в него любой наследник класса Material, и потом могу добраться до полей и методов именно этого наследника через объект f, однако до них получается добраться, если сделать их virtual в базовом классе и переопределить в наследнике.

Что я неправильно делаю?


Ответы (1 шт):

Автор решения: Alexander Petrov

Могу предложить ещё такой вариант:

class Material
{
    public string Name { get; set; }

    protected string Type;

    public Material(string name)
    {
        Name = name;
    }

    public void WhatIsIt()
    {
        Console.WriteLine($"it is {Type}");
    }
}

class Steel : Material
{
    public Steel(string name) : base(name)
    {
        Type = "steel";
    }
}

В этом случае в каждом классе-наследнике нужно задать в конструкторе защищённое поле (или свойство) Type. А метод WhatIsIt переопределять не нужно.

→ Ссылка