Полиморфизм загадки - PullRequest
       2

Полиморфизм загадки

0 голосов
/ 28 февраля 2019

Теперь я ценю, что это на самом деле вопрос, основанный на мнении, поэтому я ожидаю, что он будет закрыт, но, надеюсь, не раньше, чем появятся несколько ответов.Тема, с которой я имею дело, является новой для меня, но также и массивной.Я мог бы провести год здесь и все еще только разбивать верхушку айсберга, поэтому я немного застрял.

Итак, у меня есть ситуация, когда у меня есть три объекта реального мира, давайте назовемих HelloWorld, Foo и Bar.Бар имеет все те же свойства, что и Foo, КРОМЕ для одного.Данное свойство недействительно для бара.Вместо этого у Bar есть дополнительное свойство, уникальное для этого типа.Так что в моей голове Бар имеет смысл унаследовать Фу.Теперь HelloWorld может иметь Foo ИЛИ Bar в зависимости от обстоятельств, и операции будут выполняться по-разному в зависимости от того, какой из них он содержит.

То, что я хочу знать - это то, что приведенный ниже пример содержит воду, или у него есть кодовый запах, похожий на недельную пикшу, оставленную на солнце ?!Если он пахнет, каким будет «правильный» путь?Это все новый код - я не рефакторинг, поэтому у меня есть возможность сделать это правильно с первого раза.

public class Foo
{
    // This property is valid for Foo AND Bar
    public int Property1 { get; set;}

    // This property is valid for Foo ONLY.
    public virtual string Property2 { get; set;}
}

public class Bar
{
    // This cannot exist in Bar - so always return null, don't allow it to be set.
    public new string Property2 => null;

    // Unique to Bar.
    public List<int> Property3 { get; set;}
}

public class HelloWorld
{
    public Foo FooProperty { get; private set;}

    private HelloWorld()
    {
    }

    // Create a new object with the property as a Foo.
    public static HelloWorldWithFoo()
    {
        return new HelloWorld()
        {
            FooProperty = new Foo()
        };
    }

    // Create a new object with the property as a Bar.
    public static HelloWorldWithBar()
    {
        return new HelloWorld()
        {
            FooProperty = new Bar()
        };
    }
}

РЕДАКТИРОВАТЬ

Хорошо - такмоему «общему» примеру, возможно, не хватало необходимого контекста - извинения.Взяв на борт комментарии и т. Д., Я применил их вот так - и использовал для ясности типы реального мира.

public class Slot
{
    public CardBase CardDetails { get; set; }

    private Slot()
    {
    }

    public static Slot CreateSlotWithCard()
    {
        return new Slot()
        {
            CardDetails = new Card()
        };
    }


    public static Slot CreateSlotWithCarrierCard()
    {
        return new Slot()
        {
            CardDetails = new CarrierCard()
        };
    }
}

public class CardBase
{
    public string Name { get; set; }
    public DateTime InstallationDate { get; set; }
    public HardwareType Type { get; set; }
}

public class Card : CardBase
{
    public List<int> Ports { get; set; }
}

public class CarrierCard : CardBase
{
    public List<Card> SubCards { get; set; }
}

Выглядит ли это немного по-правильному? ??

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Так что, по моему мнению, Бар имеет смысл наследовать Foo ...

Я думаю, что это не должно быть так.Я думаю, вы хотите, чтобы они оба унаследовали от другого общего класса, чтобы хранить то, что они делят .И пусть они сохранят то, что делает их отличными для себя.

public class Common
{
    // This property is valid for Foo AND Bar
    public int Property1 { get; set; }
}

public class Foo : Common
{
    // This property is valid for Foo ONLY.
    public string Property2 { get; set; }
}

public class Bar : Common
{
    // This cannot and *hence will not* exist in Bar.
    // public new string Property2;

    // This property is valid for Bar ONLY.
    public List<int> Property3 { get; set; }
}
0 голосов
/ 28 февраля 2019

Как вы указали, это вопрос, основанный на мнении, поэтому я могу высказать свое собственное мнение по предмету, с которым, я думаю, большинство людей согласны.

Выбор того, какой тип наследует от какого другого типа должен прийтииз концептуальной модели, а не их реализации.Поэтому вы не должны спрашивать , есть ли у Foo такое свойство, а у Bar есть такое свойство, которое наследует, какое? , но вы должны спросить , является ли Foo по сути своего рода баром или наоборот? .Если ни один из них не является разновидностью другого, то подумайте о написании абстрактного базового класса или интерфейса для обоих типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...