Как создать объект базового класса с помощью интерфейсов? - PullRequest
1 голос
/ 05 июня 2019

Я хочу создать новый объект типа Dog. Класс Dog реализует интерфейс IAnimal. Животное может сделать детское животное, и это детское животное может вырасти до крупного животного типа собаки.

public interface IAnimal
{ 
BabyAnimal baby();
int NumberOfLegs { get; set; }

}

public class Dog:IAnimal
{
    public Dog() 
{

}

    public int NumberOfLegs { get; set; }

    public BabyAnimal baby()
    {
    }

}

public class BabyAnimal
{
    public IAnimal WillGrowToBe(BabyAnimal baby)
    {
        //here I want to instantiate new Dog object
    }

}

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Вы можете смоделировать это более строго, если вы вводите понятие ребенка и взрослых животных в общем виде:

public interface IAnimal
{
    int NumberOfLegs { get;}
}

public interface IBabyAnimal<TGrownAnimal>
    : IAnimal
    where TGrownAnimal : IGrownAnimal
{
    TGrownAnimal WillGrowToBe();
}

public interface IGrownAnimal : IAnimal
{

}

public class Catepillar : IBabyAnimal<Butterfly>
{
    public int NumberOfLegs { get;} = 100;
    public Butterfly WillGrowToBe() => new Butterfly();
}

public class Butterfly : IGrownAnimal
{
    public int NumberOfLegs { get; } = 0;
}

Вы можете взаимодействовать с каждым из животных как простой IAnimal для таких вещей, как количество ног, и, что приятно, вы можете написать что-то вроде этого:

public static class Extensions
{
    public static TGrown GrowUp<TGrown>(this IBabyAnimal<TGrown> baby)
        where TGrown : IGrownAnimal
    => baby.WillGrowToBe();
}

Который затем можно использовать против любого птенца, чтобы получить выращенную форму.

0 голосов
/ 05 июня 2019

Если вы хотите различать детское животное (например, Pup) и взрослое (Dog), вы можете реализовать 3 интерфейсы:

// Animal in the most general: all we can do is to count its legs
public interface IAnimal { 
    // get: I doubt if we should maim animals; let number of legs be immutable
    int NumberOfLegs { get; } 
}

// Baby animal is animal and it can grow into adult one
public interface IBabyAnimal : IAnimal { 
    IAdultAnimal WillGrowToBe()
}

// Adult animal can give birth baby animal
public interface IAdultAnimal : IAnimal { 
    IBabyAnimal Baby();
}

// Dog is adult animal, it can birth pups
public class Dog : IAdultAnimal {
    public Dog() 

    public int NumberOfLegs { get; } => 4;

    public Baby() => new Pup();
}

// Pup is baby animal which will be dog when grow up
public class Pup : IBabyAnimal {
    public Pup() 

    public int NumberOfLegs { get; } => 4;

    public WillGrowToBe() => new Dog();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...