2012-02-05 3 views
5

Я только что столкнулся с фразами «java subtype» и «true subtype». Он был задан в вопросе таким образом, чтобы было ясно, что они не то же самое. Но я не мог найти объяснения, в чем разница между ними.В чем разница между «подтипом Java» и «истинным подтипом»

Может кто-нибудь объяснить объяснения различий между «java подтипом» и «истинным подтипом»?

ответ

8

Подтип java - это любой класс, который расширяет другой класс (или даже реализует интерфейс). Истинный подтип не является специфическим для конкретного языка:

Подлинный подтип всегда может быть заменен на супертип. «Любое свойство гарантируется надтип должно быть гарантировано подтипом (истинно) подтипирования»

http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf

ссылка содержит очень enlightning примера. Допустим, у вас есть класс Point2D, который хранит значения x и y. Теперь вы можете создать подтип Point3D и добавить значение z. Если вы не переопределяете какие-либо методы и не заботитесь о методах equals и hashcode, вы можете в любой момент заменить экземпляр Point3D экземпляром Point2D.

Это простой пример, конечно. Можно утверждать, почему не только Point3D. Возможно, классы предлагают некоторые методы, которые могут - делясь на классы - лучше распознаваться как принадлежащие к 2D или 3D-сфере. В этом случае это, вероятно, будет чисто конструктивным решением.

class Point2D { 
    int x; 
    int y; 
} 

//true subtype 
class Point3D extends Point2D { 
    int z; 
} 

Более сложный пример может возникнуть, если взять класс Person, а затем два подтипа: сотрудник и клиент. Сотрудники и клиент предлагают все те же поля и методы, что и Личность.

class Person { 
    String name; 
    Date birthday; 

    @Override 
    public boolean equals(Object o){ 
     //simplified equals implementation, this does not fulfill equals contract! 
     return name.equals(((Person)o).name); 
    } 
} 

//true subtype, same behaviour 
class Employee extends Person { 
    long departmentId; 
} 

//not a true subtype, different behaviour -> equals 
class Customer extends Person { 
    long customerId; 
    Date lastContact; 
    String city; 

    public boolean equals(Object o){ 
     //simplified equals implementation, this does not fulfill equals contract! 
     return customerId.equals(((Customer)o).customerId); 
    } 
} 

В этом примере Employee будет истинным подтипом Person. Однако Клиент не является истинным подтипом, потому что реализация equals отличается (и, предположительно, hashCode()), и она не будет вести себя одинаково и, вероятно, не может быть заменена объектом Person во все времена.

+0

Если у вас есть два типа, которые всегда могут быть заменены друг на друга, его непонятно, почему у вас есть два типа в первую очередь. –

+0

Означает ли это, что истинный подтип вернет тот же результат для того же ввода, что и суперкласс, но этот подтип Java вернет другой результат для метода суперкласса с тем же входом? – SIMEL

+0

в ссылке, которую я опубликовал, является хорошим примером. истинный подтипирование - довольно теоретическая конструкция. я добавлю к ответу, чтобы уточнить – Yashima

0

См. Изображение, которое объясняет разницу.

Java Subtype Vs True Subtype

В том, что класс Человеческий имеет подобное поведение класса Позвоночной, даже если он не использует расширяет или реализует ключевые слова. Это называется Истинный подтип. В то время как класс Squid расширяет класс с использованием позвоночных расширяет ключевое слово, которое называется Java подтип.

+0

Почему Squid не является истинным подтипом Vertebrade? – SIMEL

+0

Это подтип, который называется подтипом java, потому что вы используете ключевые слова java. Я также не знаю, где мы можем использовать его практически. –

+0

Почему это так? –

 Смежные вопросы

  • Нет связанных вопросов^_^