Как изменить судьбу реализации метода интерфейса - PullRequest
0 голосов
/ 25 января 2020

Это проект библиотеки классов aspnetcore. У меня есть интерфейс

public interface ITest
{
    string TestMethod(string name);
}

и класс, который реализует интерфейс

public class Test : ITest 
{
    public virtual string TestMethod(string name)
    {
        return "hello " + name;
    }
}

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

using TestProject.Test;  

public class Tester
{
    public void TestMethod()
    {
        var testClass = new Test();
        Console.WriteLine(testClass.TestMethod("John")); // Print "hello John"
    }
}

Теперь я создал новый проект, также из библиотеки классов aspnetcore, импортировал первый проект и хочу перезаписать метод

using TestProject.Test; 

public class TestOverwritten : Test 
{
    public override string TestMethod(string name)
    {
        return "(overwritten) hello " + name;
    }
}

Мой вопрос: как я могу сделать вызов этого перезаписанного метода без необходимости изменять вызов из консольного приложения? возможно? Если так, есть ли концепция, которая определяет, что я хочу делать? (это будет Io C, или, может быть, инкапсуляция?)

using TestProject.Test;  

public class Tester
{
    public void TestMethod()
    {
        var testClass = new Test(); // I assume this line should be different ... but how?
        Console.WriteLine(testClass.TestMethod("John")); // This should print "(overwritten) hello John"
    }
}

, когда я говорю "без необходимости изменять вызов из консольного приложения" Я имею в виду, что создание объекта "var testClass = новый тест (); " быть достаточно обобщенным c, чтобы его не нужно было изменять, но при этом следует понимать, что вам больше не нужно искать реализацию метода для класса «Test», а для класса «TestOverwritten». Возможно, через файл конфигурации, который читает классы, которые реализуют интерфейс? таким образом, вы можете изменить файл конфигурации (от «Test» до «TestOverwritten»), и вам не придется изменять все методы, которые вызывают класс «Test».

1 Ответ

0 голосов
/ 25 января 2020

На самом деле вы не можете, вы должны сделать вызов производного класса.

 var testClass = new TestOverwritten();

, чтобы компилятор знал, какой вы хотите использовать родительский или производный.

...