- PVSM.RU - https://www.pvsm.ru -
Наверное у каждого во время работы или изучения новой технологии (языка) возникают вопросы вида «А что если...?», «А можно ли...?» и т.д. У меня они тоже постонно возникают, поэтому вашему вниманию 9 вопросов по C#, ответы на которые могут понадобиться наверное только чтобы успокоить свой пытливый разум.
Нет. Но абстрактным можно сделать всё свойство. При этом класс должен быть абстрактным. Модификатором доступа в этом случае может быть только public или protected (private использовать нельзя). Можно ограничить доступ getter-a или setter-а до protected, если свойство объявлено с модификатором доступа public.
Другими словами можно так:
abstract class User {
abstract public string Name { get; set; }
}
или так
abstract class User {
abstract protected string Name { get; set; }
}
и даже так:
abstract class User {
abstract public string Name { get; protected set; }
}
но не так
abstract class User {
abstract private string Name { get; set; }
}
или так
abstract class User {
abstract public string Name { get; private set; }
}
и это логично, учитывая что виртаульные (абстрактные) члены могу могут быть только public или private.
Всё зависит от того, как выполнена реализация метода в базовом классе (явно или неявно).
Рассмотрим пример:
interface IA
{
void make();
}
class Base : IA
{
void IA.make()
{
Console.WriteLine("Base implementation.");
}
}
class Derived: Base { }
при такой (явной) реализации метод make будет доступен только ссылку типа интерфейса (IA), но не будет доступен через ссылки типа Base или Derived. В тоже время при такой реализации (неявной):
interface IA
{
void make();
}
class Base : IA
{
public void make()
{
Console.WriteLine("Base implementation.");
}
}
class Derived: Base { }
метод make будет доступен через ссылки любого типа (IA, Base или Derived).
Да, могут. Например:
interface IA
{
void make();
}
class Base : IA
{
void IA.make(){
Console.WriteLine("Interface implementation.");
}
public void make()
{
Console.WriteLine("Base implementation.");
}
}
в таком случае будет вызвана явная реализация. Если явная реализация отсутствует — вызывается неявная. Если отсутствует и она — компиляция будет выполнена с ошибкой.
partial class Base{
public string Name { get; }
}
partial class Base{
public string Name { set; }
}
new virtual
разорвать цепочку виртуализации и начать новую с новым модификатором доступа.
Методы объявленные в интерфейсе не являются виртуальными. Однако, если реализацию, причём только неявную, пометить как virtual (явную реализацию пометить виртуальной нельзя), то даже через ссылку типа интерфейса вызов метода будет аналогичным вызову виртуального метода. То есть виртуальные метода будут работать как обычно. Минусом такого подхода является как минимум то, что нужно в каждом базовом классе (реализующем интерфейс) помечать метод виртуальным.
На данный момент всё. Если у есть свои примеры таких вопросов — буду рад прочитать их в комментариях. Примеры тестировались в .NET Core.
Спасибо за внимание!
Автор: незнакомец
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/277627
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/sandbox/115150/
Нажмите здесь для печати.