2015-02-24 3 views
4

Какова цель внутреннего абстрактного метода в абстрактном классе? Почему сделать абстрактный метод внутренним в абстрактном классе? если мы хотим ограничить абстрактный класс вне сборки, почему бы нам просто не сделать абстрактный внутренний класс. Есть ли какая-то другая логика.Какова цель внутреннего абстрактного метода в абстрактном классе?

ответ

7

Добавление internal элемента к public абстрактному классу делает невозможным наследование, что abstract класса вне сборки он был объявлен. Но сам класс, а также все производные классы все еще можно использовать (как типы public) вне объявления сборки.

Скажем, у вас есть абстрактный класс:

public abstract AMyClass 
{ 
    public string DoSomething() 
    { 
     return DoSomethingInternal(); 
    } 

    internal abstract string DoSomethingInternal(); 
} 

И еще один общественный класс, который наследует его, объявленную в той же сборке

public sealed MyClass : AMyClass 
{ 
    internal override string DoSomethingInternal() 
    { 
     return "Hey from MyClass!"; 
    } 
} 

Можно еще создать экземпляр MyClass в различных сборках , но вы не сможете реализовать свой собственный класс, который происходит от AMyClass, потому что вы не сможете реализовать абстрактный метод DoSomethingInternal.

+0

Спасибо Marcin за ваш ответ. Но вы можете просто объяснить свои строки ... Но сам класс, а также все производные классы все еще могут использоваться (поскольку типы являются общедоступными) за пределами объявления сборки. –

6

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

public class BaseClass 
{ 
    // Only accessible within the same assembly 
    internal static int x = 0; 
} 

Теперь в вашем случае это что-то вроде:

public abstract BaseClass 
{ 
    internal abstract void Print(); 
} 

Теперь, в этом случае все классы, которые находятся в одной сборке BaseClass, смогут переопределить метод печати BaseClass. Но вне классов сборки будут доступны только члены сообщества. как

public abstract BaseClass 
{ 
    internal abstract void Print(); 
    public abstract void Hello(); 
} 

Классы вне сборки BaseClass не будет иметь возможность использовать этот класс в качестве одного из членов этого класса является внутренним. Решение - создать подкласс в той же сборке BaseClass и использовать этот класс вне сборки.

Предлагаю вам прочитать концепцию модификатора доступа в C# от C# в глубину от @john skeet.

+0

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

+0

- это ваш класс Public? Вы сможете получить доступ к этому классу вне сборки, только если когда BaseClass является публичной @ ArunBisht – Mukund

+0

имен ClassLibrary1 { общественного абстрактного класса Class1 { внутренней абстрактной пустоты шоу(). public abstract void hide(); } } Я не могу вывести этот класс за пределы сборки .. Предоставление ошибки ... «ConsoleApplication1.Program» не реализует унаследованный абстрактный элемент. ClassLibrary1.Class1.show() ' –

1

Представьте у вас есть код в проекте

позволяет сказать свое консольное приложение, и мы называем это как ConsoleApplication1

 namespace ConsoleApplication1 
     { 
      class Program 
      { 
       static void Main(string[] args) 
       {} 

      } 

      public abstract class MyAbsClass 
      { 
       public string DoSomething() 
       { 
       return DoSomethingInternal(); 

       } 

      internal abstract string DoSomethingInternal(); 

      public abstract string DoSomethingExternal(); 

      } 

      public class MyClass:MyAbsClass 
      { 
       internal override string DoSomethingInternal(){}     
       public override string DoSomethingExternal(){} 

      } 
     } 

и теперь вы (позволяет сказать, что другой consoleApp называется ConsoleApplication2) вы построить свой ConsoleApplication1 и добавить ссылку на него

using ConsoleApplication1; 

    namespace ConsoleApplication2 
    { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
class NewClass : MyAbsClass 
{ 

    public override string DoSomethingExternal() 
    { 
     throw new NotImplementedException(); 
    } 
    } 
} 

Теперь, когда вы строите это, вы получите сообщение об ошибке Error 1 'ConsoleApplication2.NewClass' does not implement inherited abstract member 'ConsoleApplication1.MyAbsClass.DoSomethingInternal()

Почему эта ошибка ?? потому что компилятор говорит вам, что когда вы объявляете член как внутренний, класс, который находится в той же сборке, то есть (ConsoleApplication1), может получить к нему доступ.Поэтому независимо от того, сколько классов вы создаете в ConsoleApplication2, вы не сможете получить к нему доступ, потому что объявлено внутренним.

+0

да, это право @kyle. – Mukund

Смежные вопросы