2013-09-23 2 views
0

Я могу проиллюстрировать эту проблему лучше всего на примере.Force Interface/Class для определения строковой переменной в производном классе?

У меня есть интерфейс, который заставляет разработчиков реализовать определенную функцию. Я также хотел бы, чтобы этот интерфейс заставил пользователей реализовать свойство set или get, которое устанавливает имя производного класса в строке, хранящейся в классе. Так что, если разработчик создает новый класс, производный от этого интерфейса они вынуждены:

  1. Создать определение для метода.
  2. магазин имя производного класса в строке под названием «derivedType»

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

public interface someInterface 
{ 
    int someMethod(int x); 
    string derivedType {get; set;} 
} 

public derivedClass : someInterface 
{ 
    public int someMethod (int x) {...}; 
    public string derivedType 
    { 
     get {return this.derivedType;} 
     set {derivedType = "derivedClass";} 
    } 
} 
+0

Зачем вам создавать свойство с помощью setter, но затем игнорировать значение, которое оно пыталось установить? И почему вы устанавливаете значение 'outputType', а не' outputClass'? –

+0

О, и обратите внимание, что объявление свойства * означает не то же самое, что объявление переменной *. –

+0

@JonSkeet Он также опустил ключевое слово 'class' из' производного класса '. –

ответ

4

Есть две вещи: во-первых, ваш пример реализации неверен. Если вы попытаетесь получить derivedType (так как он возвращается сам), он поднимет StackOverflowException. В общем, не потребовалось бы здесь сеттер:

public interface ISomeInterface 
{ 
    int SomeMethod(int x); 
    string DerivedType {get;} 
} 

public class DerivedClass : ISomeInterface 
{ 
    public int DomeMethod (int x) {...}; 
    public string DerivedType 
    { 
     get {return "derivedType"; } 
    } 
} 

Это, как говорится, нет никакого способа силы реализатор, чтобы сделать это правильно. Если вы хотите гарантировать, что имя будет правильным, вы можете просто использовать отражение вместо того, чтобы помещать его в интерфейс (object.GetType().Name).

+0

Итак, мне даже не нужна строка, если я должен использовать object.GetType(). Имя в методе проверки типа? – user1084113

+0

@ user1084113 Да - использование 'GetType(). Имя' в экземпляре вернет имя типа через отражение. –

+0

Очень приятно, не знал, что смогу это сделать. Благодарю. – user1084113

0

Попробуйте это:

public interface someInterface 
{ 
    int someMethod(int x); 
    string derivedType {get;} 
} 

public derivedClass : someInterface 
{ 
    public int someMethod (int x) {...}; 
    public string derivedType 
    { 
     get {return "derivedType";} 
    } 
} 

То есть, сделать свойство только для чтения, и реализовать его, чтобы вернуть жестко строку. Рефакторинг при необходимости.

1

Вместо этого вы должны использовать GetType().

ISomeInterface myObject = new DerivedClass(); 
Type myType = myObject.GetType(); 
string typeName = myType.Name; // "DerivedClass" 
Смежные вопросы