Наследование и агрегация 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 переопределять не нужно.