Как потребовать реализацию абстрактного класса в C#? - PullRequest
1 голос
/ 03 мая 2020

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

public class MyClass {
    public MyDerivedClassA derived;
    public void mainClassUtility () {
        derived.foo();
    }
}

public abstract class MyAbstractBaseClass {
    public abstract void foo();
}

public class MyDerivedClassA : MyAbstractBaseClass {
    public override void foo(){
        return;
    }
}

public class MyDerivedClassB : MyAbstractBaseClass
{
    public override void foo()
    {
        return;
    }
}

По сути, я хочу убедиться, что используемый мной объект является производным от абстрактного класса и реализует все методы, которые мне понадобятся. Будет много реализаций абстрактного класса, и в зависимости от текущего состояния программы MyClass может использовать разные реализации AB C. Я хочу написать программу таким образом, чтобы независимо от того, какая реализация AB C используется в настоящее время, есть способ вызвать ее методы MyClass. Как лучше всего решить эту проблему?

Ответы [ 2 ]

1 голос
/ 03 мая 2020

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

using System;

public class Program
{
    public static void Main()
    {
        var myClassOne = new MyClass(new MyDerivedClassA());
        var myClassTwo = new MyClass(new MyDerivedClassB());

        myClassOne.mainClassUtility();
        myClassTwo.mainClassUtility();
    }

    public class MyClass 
    {   
        public MyAbstractBaseClass Derived;

        public MyClass(MyAbstractBaseClass derived)
        {
            Derived = derived;
        }

        public void mainClassUtility () 
        {
            Derived.foo();
        }
    }

    public abstract class MyAbstractBaseClass 
    {
        public abstract void foo();
    }

    public class MyDerivedClassA : MyAbstractBaseClass 
    {
        public override void foo()
        {
            Console.WriteLine("I am MyDerivedClassA");
            return;
        }
    }

    public class MyDerivedClassB : MyAbstractBaseClass
    {
        public override void foo()
        {
            Console.WriteLine("I am MyDerivedClassB");
            return;
        }
    }
}
0 голосов
/ 03 мая 2020

Как потребовать реализацию абстрактного класса в C#?

Вы не можете создать экземпляр абстрактного класса - и, следовательно, не можете использовать его в большинстве случаев. За исключением как переменная / аргумент / универсальный c аргумент типа. Вам нужно создать конкретный (неабстрактный) класс, который наследуется от него. Вы можете использовать только абстрактный класс в качестве типа переменной / аргумента. Чтобы гарантировать, что там могут использоваться только те вещи, которые наследуются от него.

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

Затем используйте абстрактный класс в качестве аргумента типа. Это означает, что в этом месте могут использоваться только экземпляры абстрактного класса (из которых не может быть экземпляром) или экземпляры классов, которые наследуют его (что кто-то еще пишет).

Обратите внимание, что абстрактные классы и интерфейсы перекрываются практически во всех случаях. Существует множество небольших различий, но я не думаю, что они имеют значение. Единственное большое различие, которое я вижу, это исключительность:

  • класс может реализовать столько интерфейсов, сколько он хочет.
  • Вы можете наследовать только от одного абстрактного класса. это означает, что это для основной, исключительной цели. Таким образом вы предотвращаете некоторые глупые идеи, например, кто-то пытается создать Windows форму, которая также является DBConnection.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...