Как узнать, можете ли вы создать экземпляр класса или интерфейса, если они запечатаны, унаследованы или абстрактны в C #? - PullRequest
0 голосов
/ 08 сентября 2018

Я испытываю трудности, зная, какой из следующих классов / интерфейсов можно создать в методе Main (с каким классом / интерфейсом все в порядке). Код выглядит так для некоторых классов и интерфейсов:

interface A {public void Method();}
class B {public static int b;}
abstract class C:B {public void Method1();}
sealed class D:B {} ;
class E:A {};
class F:A {public void Method();}
class G:C {};

А потом у нас есть метод Main в другом классе, как этот ...

class Program 
{
    static void Main(string[] args) 
    {
        A a = new A();
        B b = new B();
        A ab = new B();
        B ba = new A();
        C c = new C();
        D d = new D();
        E e = new E();
        F af = new A();
        A fa = new F();
        G g = new G();
    }
}

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

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018
  • Класс abstract не может быть создан.
  • Модификатор sealed предотвращает наследование класса, а модификатор abstract требует наследования класса.

источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract

  • Интерфейс не может быть создан напрямую.

источник: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/

Это означает, что:

class Program 
{
    static void Main(string[] args) 
    {
        A a = new A();  // ERROR: cannot instantiate interface
        B b = new B();  // OK
        A ab = new B(); // ERROR: class B doesn't implement interface A
        B ba = new A(); // ERROR: cannot instantiate interface
        C c = new C();  // ERROR: cannot instantiate abstract class
        D d = new D();  // OK
        E e = new E();  // OK
        F af = new A(); // ERROR: cannot instantiate interface
        A fa = new F(); // OK:    class F does implement interface A
        G g = new G();  // OK
    }
}
0 голосов
/ 08 сентября 2018

Большинство ваших объявлений классов не будут компилироваться. Компилируются только объявления для B, D и G.

interface A {public void Method();} // "public" cannot be used on interface members
class B {public static int b;}
abstract class C:B {public void Method1();} // method without body should be marked as "abstract"
sealed class D:B {} ;
class E:A {}; // interface methods not implemented
class F:A {public void Method();} // method does not have a body
class G:C {};

Для операторов в Main большинство из них также не компилируется:

A a = new A(); // cannot instantiate interface A
B b = new B(); // OK because B is a normal class
A ab = new B(); // B can be instantiated for aforementioned reasons, but cannot be
                // assigned to A because they are unrelated types
B ba = new A(); // cannot instantiate interface A. A also cannot be assigned to
                // B because they are unrelated.
C c = new C(); // cannot instantiate abstract class C
D d = new D(); // OK, D is a normal class. It is sealed, but that just means no 
               // class can derive from it, nothing to do with instantiation
E e = new E(); // OK, E is a normal class
F af = new A(); // cannot instantiate interface A
A fa = new F(); // F is a normal class, and is assignable to A because F implements A
G g = new G(); // OK, G is a normal class

Общие шаблоны:

  • абстрактные классы и интерфейсы не могут быть созданы
  • Ключевое слово sealed не имеет ничего общего с реализацией
  • классы только с закрытым конструктором не могут быть созданы
  • Выражение типа T1 может быть присвоено переменной типа T2, если:
    • T1 и T2 одинакового типа, или;
    • T1 наследует T2, или;
    • T1 реализует T2 или;
    • T1 неявно преобразуется в T2
0 голосов
/ 08 сентября 2018

Вы не можете обновлять интерфейсы или абстрактные классы, поэтому это может вызвать ошибки.

Интерфейсы - это просто контракты. Они не классы. Вы не можете создать их экземпляр.

Абстрактные классы могут наследоваться только. Они не могут быть созданы самостоятельно.

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

...