Я должен создать класс с точно теми же методами как java.lang.String
.
Что лучший способ состоит в том, чтобы сделать это в Java?
Я знаю, что не могу расширить Строковый класс, как это final
. Я не смотрю на решения, где я должен скопировать исходный код java.lang.String
. Например, предположите, что мне нужна функциональность length()
в моем пользовательском названном классе MyString
, который имеет соответствие 'myLength ()' метод.
Что состоит в том, чтобы реализовать лучший способ myLength()
?
Я не смотрю на различные алгоритмы для обнаружения длины строки, но к повторному использованию String
length()
метод. Теперь, после того как я имею MyString
готовый класс, я должен смочь использовать его где угодно для моих пользовательских манипуляций.
С вашего вопроса звучит как то, что вы ищете, простой делегация :
class MyString {
String delegate; // The actual string you delegate to from your class
public MyString(String delegate) {
this.delegate = delegate; // Assign the string that backs your class
}
int length() {
return delegate.length(); // Delegate the method call to the string
}
// other methods that delegate to the string field
}
Я предполагаю, что вы имеете в виду Java.lang.String
. Однако вы не можете заменить строку
с вашим собственным классом. Вы можете сделать другой класс с одинаковыми методами (копируя исходный код и изменяя декларацию пакета), но вы не сможете пропустить экземпляры этого класса к методам, которые требуют строки
.
, который поднимает важный вопрос: почему вы думаете, почему вы хотите сделать это?
Если вы просто хотите переопределить часть строкового поведения, вы можете попробовать использовать динамический прокси. Посмотрите на java.lang.reflect.proxy
в API.
Сделать новый класс (конечно, понадобится другой пакет, реализовать тот же интерфейс и добавлять все публичные методы из класса String (прочитайте Javadoc, чтобы убедиться, что у вас все) [
Я должен предположить, что это домашнее задание.
-121--3224999- С окончательных классов
нельзя подклассу, создать новый класс, который имеет экземпляр string
внутри и работает на этом объекте.
public class MyString {
private String s;
public MyString( String s ) {
setInternalString( s );
}
public int myLength() {
return getInternalString().length();
}
private void setInternalString( String s ) {
this.s = s;
}
private String getInternalString() {
return this.s == null ? "" : this.s;
}
}
Позволяет сказать, что все ваши «переменные» на самом деле являются полями POCO (простой старый объект CLR, то есть объект, который служит только для хранения данных).
class State {
public double pression_top;
public double pression_bottom;
/* hundreds and hundres of fields */
}
В этом случае можно сделать следующее:
var myState = new State();
var t = typeof(State);
foreach (var field in t.GetFields()) {
field.SetValue(myState, 1);
}
Обратите внимание, что этот код не оптимизирован и не очень удобен для параллелизма.
-121--4648574-То, что вы ищете, называется «файлы сценариев», определяется там: http://www.gnu.org/software/octave/doc/interpreter/Script-Files.html
-121--303017-Proxy design образца, я полагаю. Это глупый вопрос, хотя (не размышление о просителе, а о человеке, который задал ему это на собеседовании). Возможно, человек, спрашивающий тебя, не понял, что Последовательность окончательная? Иначе я не могу подумать, зачем они вообще спрашивали.
Вы можете использовать рефакторинг: заменить наследование с делегированием , что в основном это (как показано в предыдущих ответах) для создания переменной экземпляра нужного типа и реализовать все его методы в новом классе и прохождение сообщение им.
Создайте поле для суперкласса, отрегулируйте методы для делегирования на суперкласс и снимите подклассы.
Вы заметите, что это много набрав, вот когда приходит хорошая IDE.
Следующее видео показывает, как Imexe Idea 9 делает это.
Сделать новый класс (конечно, понадобится другой пакет, реализует тот же интерфейс и добавить все общедоступные методы из класса String (прочитайте Javadoc, чтобы убедиться, что у вас все) [
Я должен предположить, что это домашнее задание.
здесь проходит различные ответы, а также обновления и разъяснений азерстов, кажется, что то, что хочет, - это класс, который выглядит, пахнет и звучит как строка, но нет.
То есть они хотели бы иметь возможность сделать:
MyString string = "String!!";
Это не может работать, поскольку java.lang.String
- последний класс, и поэтому каждый string "
То, что компилятор производит, будет объектом Java.lang.String
, поскольку это не является объектом MyString
, который они не могут быть назначены друг другу.
В слабо набранных языках вы сможете создать такой класс, поскольку если класс выглядит, пахнет и звучит как утка , то во всех целях и целях это утка. Java, однако, является сильно напечатанным языком, и утка - это только утка, если бы оно происходит из семейства птиц Anatidae .