изменить при использовании интерфейса C # - PullRequest
1 голос
/ 05 октября 2011

У меня есть интерфейс, 2 класс

public interface ITest  
{  
 void Method1(){}  
 void Method2(){}   
}  
public class Test1 : ITest  
{  
 //Just implement Method1() (how can I just implement Method1() without implementing Method2()?)
 public string Method1()  
 {...}  
}  
public class Test2 : ITest  
{  
 //Implement both Method1() & Method2()
 public string Method1()  
 {...}  
}  

Для запроса я должен добавить в интерфейс больше метода с именем Method3 (), мой интерфейс должен быть:

public interface ITest  
{  
 void Method1(){}  
 void Method2(){}    
 void Method3(){}   
}  

Должен ли я добавить Method3 () к классу Test1 и Test2, могу ли я просто добавить, когда мне нужно.
Большое спасибо

Ответы [ 4 ]

3 голосов
/ 05 октября 2011

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

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

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

1 голос
/ 05 октября 2011

Я бы сказал, что если вы не реализуете все методы, тогда ваш класс не относится к типу ITest.Я бы написал ваш код следующим образом:

public interface ITest1
{
    void Method1();
}
public class interface ITest2 : ITest1
{
    void Method2();
}
public class Test1 : ITest1
{
    public void Method1() {}
} 
public class Test2 : ITest2
{
    public void Method1() {}
    public void Method2() {}
} 
0 голосов
/ 05 октября 2011

Вы должны реализовать метод 2, но вы можете реализовать его явно.Однако это немного некрасиво.

public interface ITest  
{  
 void Method1(){}  
 void Method2(){}   
}  
public class Test1 : ITest  
{  
 //Just implement Method1() (how can I just implement Method1() without implementing             Method2()?)
 public string Method1()  
 {...}

    private void ITest.Method2(){ throw new NotSupportedException(); }    
}  
public class Test2 : ITest  
{  
 //Implement both Method1() & Method2()
 public string Method1()  
 {...}  
}  
0 голосов
/ 05 октября 2011

Интерфейс должен быть полностью реализован его классами.

Однако, что вы можете сделать, это создать новый интерфейс с именем, которое лучше отражает его, с Method3 с другим именем, которое лучше выражаетего намерение.

И затем классы, которые должны предоставлять эту функциональность, реализуют новый интерфейс.

public interface IDescriptionOfWhatIAm
{
    void MethodNameWithGoodDescription();
}

public class Test1 : IDescriptionOfWhatIAm
{
    public void MethodNameWithGoodDescription() {}
}

Узнайте больше о принципе разделения интерфейса и принципах SOLID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...