Какова цель внутреннего абстрактного метода в абстрактном классе? Почему сделать абстрактный метод внутренним в абстрактном классе? если мы хотим ограничить абстрактный класс вне сборки, почему бы нам просто не сделать абстрактный внутренний класс. Есть ли какая-то другая логика.Какова цель внутреннего абстрактного метода в абстрактном классе?
ответ
Добавление 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
.
Внутреннее ключевое слово - это модификатор доступа для типов и типов. Внутренние типы или члены доступны только внутри файлов в одной и той же сборки, как в этом примере
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.
Спасибо Mukund, но после создания абстрактного метода внутри я не могу получить этот абстрактный класс вне сборки. Так как я переопределю его метод hello. –
- это ваш класс Public? Вы сможете получить доступ к этому классу вне сборки, только если когда BaseClass является публичной @ ArunBisht – Mukund
имен ClassLibrary1 { общественного абстрактного класса Class1 { внутренней абстрактной пустоты шоу(). public abstract void hide(); } } Я не могу вывести этот класс за пределы сборки .. Предоставление ошибки ... «ConsoleApplication1.Program» не реализует унаследованный абстрактный элемент. ClassLibrary1.Class1.show() ' –
Представьте у вас есть код в проекте
позволяет сказать свое консольное приложение, и мы называем это как 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, вы не сможете получить к нему доступ, потому что объявлено внутренним.
да, это право @kyle. – Mukund
- 1. Почему в абстрактном классе нет абстрактного метода()?
- 2. Какова цель абстрактного метода?
- 3. вызов абстрактного метода в абстрактном классе java
- 4. Конструктор в абстрактном классе
- 5. В чем смысл не абстрактного пустого метода в абстрактном классе
- 6. Какова цель метода setSelector в классе NSInvocation?
- 7. Ошибка компоновщика, не объявляя абстрактного метода в абстрактном базовом классе?
- 8. Использование не абстрактного метода и конструктора в абстрактном классе
- 9. Внедрение интерфейса в абстрактном классе
- 10. Jaxb unmarshalling абстрактного списка в абстрактном классе
- 11. Какова цель использования абстрактного состояния?
- 12. Опциональная реализация метода в абстрактном классе
- 13. Объявление статического метода в абстрактном классе
- 14. Какова цель абстрактных свойств, когда мы все еще можем использовать их в нашем абстрактном классе?
- 15. Какова цель метода glTranslatef()?
- 16. Какова цель метода Objects.compare()?
- 17. Какова цель метода «setText»?
- 18. Какова цель метода _createElement?
- 19. Какова цель метода IntStream.empty()?
- 20. Какова цель метода Thread.SpinWait?
- 21. Какова цель метода authorize в классе Request в Laravel?
- 22. Переписывание абстрактного метода в частичном классе
- 23. Какое использование элемента данных в абстрактном классе
- 24. Тестирование нереализованного метода в абстрактном классе
- 25. Наличие метода мастер-клона в абстрактном классе
- 26. Объявление метода как необязательного в абстрактном классе
- 27. Вызов метода переопределения в абстрактном классе
- 28. Вызов метода из другого метода в абстрактном классе с тем же именем в реальном классе
- 29. Конкретный метод в абстрактном классе
- 30. HttpContext имеет значение null в абстрактном классе
Спасибо Marcin за ваш ответ. Но вы можете просто объяснить свои строки ... Но сам класс, а также все производные классы все еще могут использоваться (поскольку типы являются общедоступными) за пределами объявления сборки. –