Определение типа возврата абстрактного метода от Базового класса согласно Классу Sub

Согласно вашему комментарию, если вы добавляете данные в базу данных, используя объект User, чтобы получить данные обратно, вы можете отобразить объект DocumentSnapshot в объект User, используя следующие строки кода :

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DocumentReference dataRef = db.collection("users").document(uid);
dataRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        User user = documentSnapshot.toObject(User.class);
        Log.d(TAG, user.getFullname());
    }
});
12
задан svick 18 March 2012 в 15:30
поделиться

4 ответа

Ваш абстрактный класс должен быть универсальным.

abstract class Base<T> {
        public abstract List<T> Get(); 
}

class SubOne : Base<SubOne> {
    public override List<SubOne> Get() {

    }
}

class SubTwo : Base<SubTwo> {
    public override List<SubTwo> Get() {
    }
}

Если необходимо обратиться к абстрактному классу без общего аргумента типа, используйте интерфейс:

interface IBase {
        //common functions
}

abstract class Base<T> : IBase {
        public abstract List<T> Get(); 
}
26
ответ дан 2 December 2019 в 04:53
поделиться
public abstract class Base<T> 
{       
    public abstract List<T> Get(); 
}

class SubOne : Base<SubOne> 
{
    public override List<SubOne> Get() { return new List<SubOne>(); }
}

class SubTwo : Base<SubTwo> 
{
    public override List<SubTwo> Get() { return new List<SubTwo>(); }
}
3
ответ дан 2 December 2019 в 04:53
поделиться

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

abstract class Base<SubClass> {
        public abstract List<SubClass> Get(); 
}
class SubOne : Base<SubOne> {
    public override List<SubOne> Get() {
        throw new NotImplementedException();
    }
}
class SubTwo : Base<SubTwo> {
    public override List<SubTwo> Get() {
        throw new NotImplementedException();
    }
}
1
ответ дан 2 December 2019 в 04:53
поделиться

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

public abstract class Base<T> {
  public abstract List<T> Foo();
}

public class Derived : Base<Derived> {   // Any derived class will now return a List of
  public List<Derived> Foo() { ... }     //   itself.
}
1
ответ дан 2 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: