Resharper могут обеспечить эту функциональность, например,
- Вы можете написать свой класс Person первым.
- Вы можете извлечь свой интерфейс по адресу pulling members up в интерфейс IPerson.
Следовательно, у вас могут быть созданные для Visual Studio ауты создания экземпляра Visual Studio.
UPDATE
Во всяком случае, давайте изложим на интерфейсах первыхов, ссылаясь на код, который вы предоставили в вопросе:
public class interface Person : IPerson
{
int ID { get; protected set; }
string FirstName { get; set; }
string LastName { get; set; }
string FullName { get { return FirstName + " " + LastName; } }
}
Вы должны понимать, что интерфейс не является абстрактным класс. Интерфейс - это всего лишь контракт, вид сбоку, что означает, что он расскажет объекту, чего ожидать в другом объекте, не заботясь о том, как он реализован.
С другой стороны, абстрактный класс может содержать фрагменты функциональных возможностей, которые можно унаследовать и переопределить.
В приведенном выше случае, ваш «интерфейс» является недействительным, так как:
- вы не можете объявить области действия ограничений на интерфейсах (государственные, частные, защищенный, внутренний), как это деталь реализации
- вы не можете объявить реализацию по умолчанию (например,Ваша
FullName
собственность), потому что еще раз, что это деталь реализации
Мне кажется, что вы действительно хотите это абстрактный класс, например,
public abstract class BasePerson
{
public abstract int ID { get; protected set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual string FullName { get { return FirstName + " " + LastName; } }
}
Я просто угадать, но может быть, это то, что вам действительно нужно.
UPDATE 2
Хорошо, я думаю, что я получаю на то, что вы хотите, чтобы это произошло, так что вы хотите, чтобы иметь возможность написать это:
public interface IPerson
{
int ID { get; set; }
string FirstName { get; set; }
string LastName { get; set; }
string FullName { get; }
}
А потом для вашего Реализация должна только написать следующее:
public class Person : IPerson
{
public int ID { get; protected set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
Не нужно указывать свойства FirstName и LastName.
Первой проблемой, которую мы должны решить, является тот факт, что интерфейсы не допускают ограничителей доступа при ее реализации: что произойдет, так это то, что свойства наследуют разделитель доступа по умолчанию, который является приватным.
Во-вторых, тот факт, что в то время как в наших глазах string FirstName { get; set; }
в интерфейсе и public string FirstName { get; set; }
в классе одни и те же, на самом деле они не так:
- в интерфейсе, определение собственности будет указано, что сигнатуры методов для методов getter и/или setter будут доступны для всех классов, реализующих этот интерфейс.
- в классе определение свойства даст указание CLR создать анонимный объект, который будет хранить значение указанного свойства.
Тонкая разница для программиста, миры для компилятора.
И наконец, когда вы укажете, что вы реализуете интерфейс, Visual Studio выполняет синтаксическую магию, которая автоматически делает эти заглушки для вас.
Вы уже можете это сделать ... –
Как? public class interface Person: IPerson {} не будет компилироваться с C# 3.0 –
Это не имеет смысла. Если человек внедряет IPerson, вы можете сделать IPerson p = new Person(); –