Принудительное совпадение параметров - PullRequest
0 голосов
/ 07 сентября 2018

Имея класс Base и класс Derived : Base, как реализовать функцию

void Foo(Base obj) { } // Must be restricted to Base type

где этот код компилируется

var obj = new Base();
Foo(obj);

а этот код не?

var obj = new Derived();
Foo(obj);

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вы не можете ограничить метод только принятием параметров определенного типа во время компиляции , если только этот тип не равен sealed. Фактически, это нарушило бы любой объектно-ориентированный принцип, поскольку экземпляр производного типа всегда является экземпляром базового класса. С другой стороны, ваш Foo -метод вообще не должен заботиться об этом, поскольку он ничего не знает о производном типе. Все, что он получает, это аргумент типа Base, который может быть или не быть производного типа.

Во время выполнения вы, конечно, можете получить фактический тип и выдать исключение для случая Derived:

public void Foo(Base @base)
{
    if(@base.GetType() != typeof(Base))
        throw new NotSupportedException("must be of type Base");
}

В качестве отступления: base является зарезервированным ключевым словом и не может использоваться в качестве имени для переменной. Таким образом, я добавил дословно (@) в код.

0 голосов
/ 07 сентября 2018

Я не думаю, что вы можете сделать это в C #.

Но вы можете проверить тип параметра в вашем методе и выполнить необходимые действия. Скрипка

 public static void Main(string[] args)
    {
        var derived = new Derived();
        var b = new Base();
        D(derived); //Derived
        D(b); //Base
    }

    public static void D(Base base)
    {
        Console.WriteLine(base.GetType());

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