Я просто немного поиграю с наследованием и/или полиморфизмом на C#, и так как мои навыки ООП очень, очень простые, мне интересно, возможно ли это :C#: переопределить унаследованный метод, но не для всего класса
у меня есть класс, который наследует метод из базового класса:
class BaseClass {
public void Init() {
// Do basic stuff.
}
}
class LoginTest : BaseClass {
public void StraightMethod() {
// Do stuff based on the actions in the inherited Init() method from BaseClass.
}
public void ExceptionMethod() {
// Do stuff where I don't want to do the actions in the inherited method.
// That is, skip or override the Init() method in the BaseClass class.
}
}
Я знаю, что могу переопределить метод Init()
для всего класса, но можно изменить его, либо код в он, только для метода ExceptionMethod()
? Эти методы запускаются исключительно, так что, например, одна инициализация класса LoginTest
будет работать только с LoginClass.ExceptionMethod()
, а другая может работать LoginClass.StraightMethod()
.
И да, я знаю, что хороший дизайн устранит необходимость в подобных вещах. Но, прежде всего, я не занимаюсь разработкой программного обеспечения здесь, поэтому часто прагматично, без разрушения какого-либо дизайна или других принципов. Во-вторых, это скорее вопрос о том, можно ли сделать что-то, а не мудрость.
Обратите внимание, что эти классы и методы являются методами UnitTest, поэтому метод Init() является методом [TestInitialize]. Следовательно, он вызывается автоматически, когда LoginTest наследует от BaseClass.
Вы можете только переопределить абстрактный или виртуальный метод. Что вы подразумеваете под переопределением внутри метода? – Habib
Я думаю, вы запутаны. «Init» - это всего лишь метод, вы не «переопределяете его» только для одного другого метода. В какой момент вы все равно называете «Init»? Если вам нужно, чтобы он вызывался иногда, но не другие, тогда вы должны явно называть его, когда это необходимо, и иначе вызывать другой метод. Это не имеет особого отношения к полиморфизму. – Mashton
Это логически невозможно; вы вызываете 'Init()' прежде, чем вы узнаете, какая функция будет вызвана. – SLaks