Простой Фабричный Образец в C# - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь создать простой шаблон фабрики. Ниже приведен пример кода:

Мобильный:

namespace SimpleFactory
{
public interface IMobile
{
 void Hello();
}
}

IPhone:

namespace SimpleFactory
{
public class Iphone : IMobile
{
    public void Hello()
    {
        Console.WriteLine("Hello, I am Iphone!");
    }
}
}

Nokia

namespace SimpleFactory
{
public class Nokia : IMobile
{
    public void Hello()
    {
        Console.WriteLine("Hello, I am Nokia!");
    }
}
public void NokiaClassOwnMethod()
    {
        Console.WriteLine("Hello, I am a Nokia class method. Can you use me 
with Interface");
    }
}

MobileFactory:

namespace SimpleFactory
{
public class MobileFactory
{
    public IMobile GetMobile(string mobileType)
    {
        switch (mobileType)
        {
            case "Nokia":
                return new Nokia();
            case "iPhone":
                return new Iphone();
            default:
                throw new NotImplementedException();
        }
    }
}
}

Программа:

namespace SimpleFactory
{
class Program
{
    static void Main(string[] args)
    {
        MobileFactory factory = new MobileFactory();
        IMobile mobile = factory.GetMobile("Nokia");
        mobile.Hello(); 
        mobile.NokiaClassOwnMethod();


    }
}
}

Я хотел бы получить доступ к методу NokiaClassOwnMethod в Nokia и Iphone. Могу ли я получить доступ к методу NokiaClassOwnMethod из класса Nokia или Iphone. Если нет, то почему? (Я могу добавить этот метод NokiaClassOwnMethod в интерфейс и получить к нему доступ. Но у меня вопрос: как я могу получить доступ к собственным методам класса?)

1 Ответ

1 голос
/ 29 февраля 2020

Для этого вам нужно добавить метод Hello к вашему интерфейсу:

public interface IMobile
{
   void Hello();
}

Ранее он не был доступен, поскольку ваш фабричный метод возвратил интерфейс, а интерфейс не содержал Hello() метод. Таким образом, во время выполнения могут быть возвращены различные типы, и когда вы вызываете Hello дочерний спецификатор c, будет вызвана реализация класса. Если вы хотите иметь доступ к методу / свойству, которое не существует в интерфейсе, но в конкретной реализации, вам необходимо привести:

MobileFactory factory = new MobileFactory();
IMobile mobile = factory.GetMobile("Nokia");
var iPhone = mobile as Iphone;
if(iPhone != null) iPhone.Hello();
...